Alteração de Uma Chave Primária Via Programação
Olá,
Tenho uma chave primária (PK_NOMECHAVEPRIM) em uma tabela com dois campos. Quero incluir um terceiro campo nessa tabela. Não quero simplesmente excluir e reincluir a constraint. Preciso antes verificar se ela já tem ou não o terceiro campo e, em caso negativo, drop e add.
Como verifico se determinado campo de uma tabela já existe em uma constraint?
Obrigado.
Tenho uma chave primária (PK_NOMECHAVEPRIM) em uma tabela com dois campos. Quero incluir um terceiro campo nessa tabela. Não quero simplesmente excluir e reincluir a constraint. Preciso antes verificar se ela já tem ou não o terceiro campo e, em caso negativo, drop e add.
Como verifico se determinado campo de uma tabela já existe em uma constraint?
Obrigado.
Valdir Dill
Curtidas 0
Respostas
Wilson Junior
30/04/2010
Bom, não foi especificado qual o banco de dados você utiliza, mas segue abaixo para o firebird
Se o SQL retornar vazio, não possui o campo na chave primária, se caso existir, retorna com um registro e com o valor 1 para o campo "Existe".
Espero ter colaborado.
SELECT
1 AS Existe
FROM
RDB$INDICES i
INNER JOIN RDB$INDEX_SEGMENTS ise ON (i.RDB$INDEX_NAME = ise.RDB$INDEX_NAME)
WHERE
UPPER(i.RDB$INDEX_NAME) = UPPER('Nome_PrimaryKey')
AND UPPER(ise.RDB$FIELD_NAME) = UPPER('NomeCampo')
Se o SQL retornar vazio, não possui o campo na chave primária, se caso existir, retorna com um registro e com o valor 1 para o campo "Existe".
Espero ter colaborado.
GOSTEI 0
Valdir Dill
30/04/2010
Obrigado Wilson.
Fiz uma rotina mais completa e vou deixá-la aqui postada para outros colegas que tiverem a mesma dúvida. Trabalhando um pouco mais nessa rotina, ela servirá inclusive para verificar várias outras informações de índices.
function TDM.CampoExisteNaChavePrimaria(VTabela,VCampo : String) : boolean;
begin
SQLQuery2.Close; SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME AS TABELA, '+
'RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME AS CHAVE, RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME AS '+
'INDICE_DA_CHAVE, RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS CAMPO, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION AS POSICAO '+
'FROM RDB$RELATION_CONSTRAINTS, RDB$INDICES, RDB$INDEX_SEGMENTS WHERE '+
'RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME = ' + QuotedStr(VTabela) + ' AND '+
'RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = ''PRIMARY KEY'' AND '+
'RDB$INDEX_SEGMENTS.RDB$FIELD_NAME = ' + QuotedStr(VCampo) + 'AND '+
'RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME AND RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = '+
'RDB$INDICES.RDB$INDEX_NAME ORDER BY RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME, '+
'RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION ');
SQLQuery2.Open;
result := not SQLQuery2.IsEmpty;
end;
Fiz uma rotina mais completa e vou deixá-la aqui postada para outros colegas que tiverem a mesma dúvida. Trabalhando um pouco mais nessa rotina, ela servirá inclusive para verificar várias outras informações de índices.
function TDM.CampoExisteNaChavePrimaria(VTabela,VCampo : String) : boolean;
begin
SQLQuery2.Close; SQLQuery2.SQL.Clear;
SQLQuery2.SQL.Add('SELECT RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME AS TABELA, '+
'RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME AS CHAVE, RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME AS '+
'INDICE_DA_CHAVE, RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS CAMPO, RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION AS POSICAO '+
'FROM RDB$RELATION_CONSTRAINTS, RDB$INDICES, RDB$INDEX_SEGMENTS WHERE '+
'RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME = ' + QuotedStr(VTabela) + ' AND '+
'RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = ''PRIMARY KEY'' AND '+
'RDB$INDEX_SEGMENTS.RDB$FIELD_NAME = ' + QuotedStr(VCampo) + 'AND '+
'RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME AND RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = '+
'RDB$INDICES.RDB$INDEX_NAME ORDER BY RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME, '+
'RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION ');
SQLQuery2.Open;
result := not SQLQuery2.IsEmpty;
end;
GOSTEI 0