[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