Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Abortar a operação de inserção/atualização no gatilho usando PL/SQL


Não vá lá.

ORA-04091: table XXXX is mutating geralmente é um bom indicador de que o que você está tentando fazer é muito complexo para ser feito de forma confiável com gatilhos.

Claro, você pode usar uma variável de matriz de pacote e um punhado de gatilhos ( ah!) para contornar esse erro, mas seu código provavelmente:
  • ser insustentável devido à sua complexidade e à natureza imprevisível dos acionadores
  • não respondem bem a um ambiente multiusuário

É por isso que você deve repensar sua abordagem quando encontrar esse erro. Eu aconselho você a construir um conjunto de procedimentos bem agrupados em um pacote para lidar com a consistência entre linhas. Revogue todos os privilégios para fazer DML na tabela diretamente e use apenas esses procedimentos para modificá-la.

Por exemplo, seu procedimento de atualização seria um atômico processo que seria:
  1. adquira um bloqueio para evitar atualizações simultâneas no mesmo grupo de linhas (por exemplo, bloqueie o registro do quarto em um aplicativo de reserva de hotel).
  2. verifique se a linha a ser inserida valida toda a lógica de negócios
  3. criar todos os DML relevantes
  4. reverte todas as suas alterações (e apenas suas alterações -- não toda a transação) em caso de erro (fácil com PL/SQL, basta gerar um erro).