Erro em trigger no Oracle

Alguém sabe me dizer o que tá ocorrendo, tenho uma tabela pai e nela há uma trigger que no “before delete” faz com que todas as tabelas filhas sejam deletadas, porém quando executo o delete ele me dá o seguinte erro:

ORA-04091: table TABELA_FILHA is mutating, trigger/function may not see it
ORA-06512: at TRIGGER, line LINHA
ORA-04088: error during execution of trigger TRIGGER. Process stopped. Use Step or Run to continue.

O código da trigger é simples:

...
BEGIN

  DELETE FROM TABELA_FILHA
  WHERE FK = :old.FK;

END TRIGGER;

Olá,

Como existe uma Fk entre as tabelas pai e filha e tu comecou uma transacao no tabela pai (delete), o Oracle não vai deixar tu deletar a tabela filha pelo simples fato do registro estar sendo alterado já (fk). Isso faz parte da consistencia que o Oracle implementa.
Uma solução seria, fazer o delete em uma procedure e nesta usar um pragma de restrict transaction, assim o oracle irá abrir uma nova transacao para fazer o delelte na tabela filha.
Mesmo assim eu não tenho certeza se ele irá deixar tu realizar este delete pq a primeira transacao ja iniciou. Faz tempo quenão passo por isso, mas é uma de tentar.

Para mais detahles sobre pragmas o PL/SQL Guide da Oracle é uma boa consulta. Mas para qualquer duvida pode perguntar.

]['s

É, vc tem razão, acho q eu devo então fazer um delete cascade mesmo no relacionamento…

o estranho é que possuo dois users no esquema do oracle, em um deles funciona, em outro não, o que notei é que no que apresenta o erro possui o “DELETE CASCADE” eqto que no que dá certo não possui essa regra.

Sabe se tem algo a ver?

falow

[quote=“eduardo_lopes”]É, vc tem razão, acho q eu devo então fazer um delete cascade mesmo no relacionamento…

o estranho é que possuo dois users no esquema do oracle, em um deles funciona, em outro não, o que notei é que no que apresenta o erro possui o “DELETE CASCADE” eqto que no que dá certo não possui essa regra.

Sabe se tem algo a ver?

falow[/quote]

Quem é o owner da tabela?

]['s

Quando eu disse “User” quis dizer owners, tenho triggers parecidas em dois owners diferentes, um deles possui o atributo “DELETE CASCADE” para as tabelas filhas, esse me causa esse erro, enquanto que o outro que não possui o “DELETE CASCADE” deleta as filhas no “BEFORE DELETE” da tabela pai normalmente.

Acho que está havendo redundância nos deletes, vou ver com quem baixou as tabelas para que verifique os scripts SQL.

Olá,

É justamente pelo fato que falei a cima. Quando tem DELETE CASCADE o banco ja da lock nos registros filhos para poder deletar eles, assim ele não deixa abrir uma segunda transação para os mesmos registros e te indica o mutanting table, ou seja a tabela ja esta em mutação, em tranformação…estranho, mas é assim mesmo que funciona. :wink:

No incio eu imaginei que poderia ser a FK que estivesse dando lock nos registros, mas pelo jeito é o DELETE CASCADE, por sinal isso faz sentido, o banco precisa dos registros locados para poder deletar eles.

]['s