Fórum Firebird, Inclusão de Constraint Manual...... #43322
23/03/2004
0
Estou com um problema tenho que incluir mais um campo como chave primaria mas o mesmo não deixa porque existe várias relacionamentos com esses campos. Então pesquisei nas system tables e consegui achar o local aonde fica armazenado os campos chaves de cada tabela, então resolvi criar um procedimento para adicionar o campo...... é:
CREATE PROCEDURE INCLUI_CAMPO_CHAVE_PRIMARIA (
PNOME_CHAVE_PRIMARIA VARCHAR(60),
PNOME_DA_TABELA VARCHAR(60),
PNOME_CAMPO VARCHAR(60))
AS
DECLARE VARIABLE INDECE VARCHAR(100);
DECLARE VARIABLE POSICAO_CAMPO INTEGER;
DECLARE VARIABLE EXISTE INTEGER;
begin
/* Este procedimento servirá para adicionar mais um campo na
Chave primária de uma tabela já existente que não pode ser
Excluida....
*/
SELECT R.RDB$INDEX_NAME FROM RDB$RELATION_CONSTRAINTS R
WHERE R.RDB$CONSTRAINT_NAME =:PNOME_CHAVE_PRIMARIA
AND R.RDB$RELATION_NAME=:PNOME_DA_TABELA
INTO :INDECE;
IF (INDECE IS NOT NULL ) THEN
BEGIN
/*
Inicializando a variável para fazer o teste
*/
EXISTE=-1;
/*
Verificando se o campo já não está incluido na chave primária
*/
SELECT P.RDB$FIELD_POSITION FROM RDB$INDEX_SEGMENTS P
WHERE
P.RDB$INDEX_NAME =:INDECE AND
P.RDB$FIELD_NAME =:PNOME_CAMPO
INTO :EXISTE;
IF (:EXISTE = -1 ) THEN
BEGIN
/*
Verificando qual é o próximo número de ordem da chave primária
*/
SELECT MAX(RDB$FIELD_POSITION)+1 AS PROXIMO FROM RDB$INDEX_SEGMENTS
WHERE
RDB$INDEX_NAME =:INDECE
INTO :POSICAO_CAMPO;
INSERT INTO RDB$INDEX_SEGMENTS(
RDB$INDEX_NAME /* NOME DO INDECE INTERNO NO FIREBIRD*/ ,
RDB$FIELD_NAME /* NOME DO CAMPO QUE DESEJA ADICIONAR A CHAVE PRIMARIA */,
RDB$FIELD_POSITION /* ORDEM DE ORDENACAO QUE APARECERÁ A TABELA */
)
VALUES
(:INDECE,:PNOME_CAMPO,:POSICAO_CAMPO);
END
END
suspend;
end
Até aqui tudo bem ele adiciona o campo que quiseres como campo da chave primária, mas só que não funciona, alguém sabe se esquici de alguma tabela.....
Desde já agradeço a ajuda de todos...
Ulisses
Ulissesn
Curtir tópico
+ 0Posts
23/03/2004
Afarias
Não é o q vc quer mas, o q vc tem q fazer é::
dropar todas as chaves estrangeiras q usam esta chave primária
dropar a chave primária
criar a nova chave primária (incluindo o novo campo)
re-criar todas as chaves estrangeiras (para a nova chave primária)
para tudo isso vc deve usar apenas o comando ALTER TABLE
ALTER TABLE tabela DROP CONSTRAINT ...
ALTER TABLE tabela ADD CONSTRAINT ...
T+
Gostei + 0
23/03/2004
Ulissesn
This operatio no defined for system tables
unsuccessfull metadata update.
Object index in use....
Gostei + 0
23/03/2004
Ulissesn
Gostei + 0
23/03/2004
Afarias
|estrangeira.....
como está o comando para DROPAR a chave estrangeira?
T+
Gostei + 0
23/03/2004
Ulissesn
ALTER TABLE CONTAS_RECEBER DROP CONSTRAINT FK_CONTAS_RECEBER_FILAL;
Gostei + 0
23/03/2004
Afarias
Qualquer coisa, aproveite a faça um backup e restaure o banco e ai tente a alteração
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)