Alteração de Uma Chave Primária Via Programação

Delphi

30/04/2010

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.
Valdir Dill

Valdir Dill

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

30/04/2010

Bom, não foi especificado qual o banco de dados você utiliza, mas segue abaixo para o firebird
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

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;

GOSTEI 0
POSTAR