Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DaniloTec

[Resolvido] Problema com trigger

Recommended Posts

Boa noite.

 

Fiz uma trigger que deleta o registro da tabela caso o um determinado valor não seja o esperado. Ao executar a função era exibido um erro referente a tabela mutante.

Pesquisei e vi que o Oracle (pra variar) não permite que uma trigger altere o valor da tabela que a disparou.

Depois vi que existe uma propriedade chamada PRAGMA Autonomous_Transaction. Esta propriedade até funciona, mas não permite alterar ou deletar o registro que foi inserido no momento que foi executado a trigger.

 

Segue o código:

CREATE OR REPLACE 
TRIGGER TRG_TABELA AFTER INSERT ON TABELA FOR EACH ROW

DECLARE
PRAGMA Autonomous_Transaction;

BEGIN
 IF :NEW.CODIGO_RETORNO_WS <> 0 THEN
   DELETE FROM TABELA WHERE ID = :NEW.ID;
   COMMIT;
 END IF;
END;

 

A trigger permite eu alterar os outros registros que já estavam na tabela, mas não permite eu fazer qualquer tipo de alteração no registro correspondente ao :NEW.ID.

 

Existe outra forma de se fazer isto?

 

Vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi seria melhor fazer uma trigger de validação.

segue exemplo

 

CREATE OR REPLACE  
TRIGGER TRG_TABELA BEFORE INSERT OR UPDATE ON TABELA FOR EACH ROW 

DECLARE  
BEGIN 
 IF :NEW.SIGLA_UF NOT IN ('RJ','SP','MG','ES') THEN 
   RAISE_APPLICATION_ERROR(-20001,'A GENTE SÓ ATUAMOS NO SUDESTE !!!');
 END IF; 
END;

 

poderia ser uma constraint, mas é apenas um exemplo, se se

tentar inserir ou alterar SIGLA_UF para "RS" por exemplo dará erro e

o registro não será inserido.

 

Outra solução é anular o campo errado (se permite nulo)

 

CREATE OR REPLACE  
TRIGGER TRG_TABELA BEFORE INSERT OR UPDATE ON TABELA FOR EACH ROW 

DECLARE  
BEGIN 
 IF :NEW.SIGLA_UF NOT IN ('RJ','SP','MG','ES') THEN 
   :NEW.SIGLA_UF := null;
 END IF; 
END;

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais ou menos, Motta.

O problema é que eu não posso retornar uma mensagem de erro.

 

Depois de muito pesquisar cheguei a conclusão de que isso não é possível, mas acabei contornando de outra forma.

Dentro da procedure que grava eu chamo outra procedure que faz a verificação que a trigger deveria fazer, isso funciona.

Também é possível fazer o mesmo procedimento com package, fica a critério do programador.

 

A cada dia que passa vejo o quanto o Oracle é inflexível. Já trabalhei um bom tempo com SQL Server e MySQL e ficaria muito feliz em nunca mais ter que trabalhar com Oracle. ;)

 

Vlw pela força, Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me lembrei disto depois.

 

Meio que discordo de sua implacância com o Oracle ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.