[firebase-br] FB 2.0 UPDATE CASCADE -> Erro?

Rafael Cabral rafael.cabral em intercraft.inf.br
Seg Ago 8 09:46:03 -03 2005


Pessoal,
 
Estava fazendo alguns testes no Firebird 2.0 release 3, entre eles um teste
para saber como se comporta no caso do CASCADE UPDATE. Vou mostrar passo a
passo o que fiz para reportar o que aconteceu:
 
1) Criei uma tabela chamada CLIENTE:
 
CREATE TABLE CLIENTE (NOME VARCHAR(30) NOT NULL);
 
2) Criei uma tabela chamada DEPTO:
 
CREATE TABLE DEPTO (CLIENTE VARCHAR(30) NOT NULL, DEPTO VARCHAR(30) NOT
NULL);
 
3) Criei uma tabela chamada USUARIO:
 
CREATE TABLE USUARIO (CLIENTE VARCHAR(30) NOT NULL, DEPTO VARCHAR(30),
USUARIO VARCHAR(30) NOT NULL);
 
4) Cria as chaves primárias:
 
ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (NOME);
ALTER TABLE DEPTO ADD CONSTRAINT PK_DEPTO PRIMARY KEY (CLIENTE, DEPTO);
ALTER TABLE USUARIO ADD CONSTRAINT PK_USUARIO PRIMARY KEY (CLIENTE,
USUARIO);
 
5) Cria as chaves estrangeiras:
 
ALTER TABLE DEPTO ADD CONSTRAINT FK_CLIENTE_DEPTO FOREIGN KEY (CLIENTE)
REFERENCES CLIENTE(NOME);
ALTER TABLE USUARIO ADD CONSTRAINT FK_CLIENTE_USUARIO FOREIGN KEY (CLIENTE)
REFERENCES CLIENTE(NOME);
ALTER TABLE USUARIO ADD CONSTRAINT FK_DEPTO_USUARIO FOREIGN KEY (DEPTO)
REFERENCES DEPTO(DEPTO);
 
Crei a tabela de forma que o campo DEPTO na tabela USUARIO não seja
obrigatório
 
6) Comecei a inserir os dados em CLIENTE e DEPTO:
 
TABELA CLIENTE:
 
NOME
---------
Fulanos SA
Padaria Joaquim
 
Tabela DEPTO:
 
CLIENTE           DEPTO
-------------     ------------
Fulanos SA        Cobrança
Fulanos SA        Financeiro
 
 
7) Realizei a alteração na tabela CLIENTE
 
UPDATE CLIENTE SET NOME = 'Fulanos' WHERE NOME = 'Fulanos SA';
 
Funcionou!
 
Tabela CLIENTE
 
NOME
---------
Fulanos
Padaria Joaquim
 
Tabela DEPTO:
 
CLIENTE            DEPTO
-------------      ------------
Fulanos            Cobrança
Fulanos            Financeiro
 
 
8) Inclui os dados de USUARIO:
 
Tabela USUARIO:
 
CLIENTE                USUARIO            DEPTO
--------------         --------------     ------------
Fulanos                Antônio            Cobrança
Fulanos                Carlos             Cobrança
Fulanos                Mario              Financeiro
Padaria Joaquim        Joaquim
 
 
9) Tentei atualizar CLIENTE
 
UPDATE CLIENTE SET NOME = 'Fulanos SA' WHERE NOME = 'Fulanos';        //ERRO
-> Foreign Key reference target does not exist
 
Não efetuou a atualização em cascata.
 
10) Apaguei o relacionamento FOREIGN_CLIENTE_USUARIO
 
ALTER TABLE USUARIO DROP CONSTRAINT FK_CLIENTE_USUARIO;
 
11) Inclui o relacionamento novamente:
 
ALTER TABLE USUARIO ADD CONSTRAINT FK_CLIENTE_USUARIO FOREIGN KEY (CLIENTE)
REFERENCES CLIENTE(NOME);
 
12) Tentei efetuar a atualização novamente
 
UPDATE CLIENTE SET NOME = 'Fulanos SA' WHERE NOME = 'Fulanos';
 
Funcionou:
 
Tabela CLIENTE
 
NOME
---------
Fulanos SA
Padaria Joaquim
 
Tabela DEPTO:
 
CLIENTE            DEPTO
-------------      ------------
Fulanos SA         Cobrança
Fulanos SA         Financeiro
 
 
Tabela USUARIO:
 
CLIENTE                USUARIO            DEPTO
--------------         --------------     ------------
Fulanos SA             Antônio            Cobrança
Fulanos SA             Carlos             Cobrança
Fulanos SA             Mario              Financeiro
Padaria Joaquim  	     Joaquim
 
 
Agora vem a minha pergunta. Isso é um bug do release 3 do FB 2.0 ou o
procedimento de não atualização de cascata de avô (CLIENTE) para neto
(USUARIO) conforme explicado é o correto, porém eu gerei um erro quando
apaguei e criei novamente a referência?
 
[]s,
 
Rafael Cabral






Mais detalhes sobre a lista de discussão lista