ORA-04091 – Trigger mutante

Fala pessoal, essa semana uma amiga estava pedindo ajuda sobre um erro em uma trigger que ela estava desenvolvendo, o famoso erro X-MAN, trigger mutante.
Este erro ocorre quando criamos uma trigger para determinada tabela no banco de dados e, dentro dela, tentamos manipular os dados dessa mesma tabela, enfrentamos o problema de trigger mutante, o código de erro Oracle é ORA-04091.

Trigger com problema:

CREATE OR REPLACE TRIGGER TG_INSERT_UPDATE_FUNCIONARIO
AFTER INSERT OR UPDATE ON TB_FUNCIONARIO
FOR EACH ROW
DECLARE
v_qtd_cpf number := 0;
BEGIN
SELECT COUNT(*) INTO v_qtd_cpf FROM tb_funcionario WHERE cpf = to_char(:NEW.CPF);
IF (v_qtd_cpf > 0) THEN
RAISE_APPLICATION_ERROR(-20001,'Atenção: Já existe esse CPF em nossa base de dados.!');
END IF;
END;
SQL

Para resolver este problema fui pesquisar na documentação da Oracle e encontrei a solução utilizando essa propriedade PRAGMA AUTONOMOUS_TRANSACTION.

O PRAGMA AUTONOMOUS_TRANSACTION muda a forma de um subprograma funciona dentro de uma transação. Um subprograma marcado com este pragma pode fazer operações SQL e confirmar ou reverter essas operações, sem confirmar ou reverter os dados da transação principal.

Link: http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm

Trigger com a utilização desta propriedade:

CREATE OR REPLACE TRIGGER TG_INSERT_UPDATE_FUNCIONARIO
AFTER INSERT OR UPDATE ON TB_FUNCIONARIO
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
v_qtd_cpf number := 0;
BEGIN
SELECT COUNT(*) INTO v_qtd_cpf FROM tb_funcionario WHERE cpf = to_char(:NEW.CPF);
IF (v_qtd_cpf > 0) THEN
RAISE_APPLICATION_ERROR(-20001,'Atenção: Já existe esse CPF em nossa base de dados.!');
END IF;
END;
SQL

Leave a Reply

Your email address will not be published. Required fields are marked *

search previous next tag category expand menu location phone mail time cart zoom edit close