- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 12 anos, 9 meses atrás por burga.
-
AutorPosts
-
8 de fevereiro de 2012 às 5:33 pm #102699mguedesParticipante
Tenho uma tabela LOCACAO onde desejo escluir uma linha, porem esta tabela tem uma chave estrangeira com a tabela ITENSLOCACAO onde a chave primadia codlocacao da tabela LOCACAO é chave estrangeira na tabela ITENSLOCACAO.
Logo se tentar excluir uma linha da tabela LOCACAO o oracle ñ vai deixar indicando que há uma estrição de chave estrageira.
Quero fazer uma trigger que exclua a linha na tabela ITENSLOCACAO referente a mesma chave que estiver vinculada a linha da tabela LOCACAO que estiver deletando, assim doda vez q for excluir uma linha da tabela LOCACAO sera excluido antes a linha da tabela ITENSLOCACAO que tem a restrição de chave estrangeira, de modo que ñ haverá mais o erro de restrição ao deletar linhas na tabela LOCACAO.
Alguem pode me explicar como fazer esa trigger???
8 de fevereiro de 2012 às 7:27 pm #102702burgaParticipanteEu particularmente não gosto muito dessas coisas, porque a chance de dar m**** é grande, mas se faz parte da sua necessidade, dê uma olhada na utilização da cláusula ON DELETE CASCADE na criação de uma constraint de FK.
8 de fevereiro de 2012 às 7:40 pm #102703rmanParticipante@mguedes
O que você quer implementar via trigger já existe de forma nativa no Oracle que é uma das opções da chave estrangeira.
CREATE TABLE LOCACAO(
ID NUMBER
,FOO NUMBER
);ALTER TABLE LOCACAO ADD CONSTRAINT PK_LOCACAO PRIMARY KEY(ID);
CREATE TABLE ITENSLOCACAO(
ID NUMBER
,LOCACAO_ID NUMBER
,BAR NUMBER
);ALTER TABLE ITENSLOCACAO ADD CONSTRAINT PK_ITENSLOCACAO PRIMARY KEY(ID);
ALTER TABLE ITENSLOCACAO ADD CONSTRAINT FK_ITENSLOCACAO_LOCACAO FOREIGN KEY(LOCACAO_ID) REFERENCES LOCACAO(ID) ON DELETE CASCADE;
INSERT INTO LOCACAO(ID,FOO) VALUES(1,1);
INSERT INTO ITENSLOCACAO(ID,LOCACAO_ID,BAR) VALUES(1,1,1);
INSERT INTO ITENSLOCACAO(ID,LOCACAO_ID,BAR) VALUES(2,1,2);
COMMIT;DELETE FROM LOCACAO WHERE ID = 1;
COMMIT;DROP TABLE ITENSLOCACAO PURGE;
DROP TABLE LOCACAO PURGE;
A sacada está na clausula ON DELETE CASCADE na definição da chave estrangeira.
8 de fevereiro de 2012 às 7:43 pm #102704rmanParticipante@burga
Você acabou respondendo primeiro, eu ainda esta digitando… 😆
Mas eu também não costumo utilizar esse recurso, prefiro apagar na mão o filho depois o pai, pelo menos não terei surpresas…
Dependendo da situação, deixar o Oracle gerenciar isso pode cascatear o banco todo, já pensou puxar uma folha e vir a arvore inteira ? 😯
8 de fevereiro de 2012 às 7:53 pm #102705burgaParticipante@rman
O seu post está bem mais elaborado do que o meu… hehehe
Melhor pro mguedes que não vai precisar correr tanto atrás da sintaxe correta do comando… Já está tudo entregue na bandeja com um bom exemplo de código!! 8)
Realmente, se começar a cascatear os deletes a gente acaba perdendo um pouco o controle, por isso que eu não gosto dessa solução. Mas vai da necessidade de cada um… hehehehe
-
AutorPosts
- Você deve fazer login para responder a este tópico.