DaniloTec 0 Denunciar post Postado Agosto 21, 2012 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
Motta 645 Denunciar post Postado Agosto 21, 2012 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
DaniloTec 0 Denunciar post Postado Agosto 23, 2012 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
Motta 645 Denunciar post Postado Agosto 23, 2012 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