Ir para conteúdo

Arquivado

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

hermesmc

Trigger com raise e insert

Recommended Posts

Senhores(as), preciso de uma solução para impedir que um programa de terceiros não efetue um update em determinada tabela dependendo da situação. Além disso eu gostaria de incluir em uma tabela de log o registro que o usuário tentou atualizar. Pensei em uma trigger com raise exeception error e insert. Mas o raise impede o insert. Alguém teria uma sugestão para essa situação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A trigger poderia ser de before update e baseado numa regra impedir a operação.

 

Algo assim

 

CREATE OR REPLACE TRIGGER MINHA_TRIGGER BEFORE UPDATE IN MINHA_TABELA
IS

BEGIN
 IF USER NOT IN ('ATHUS','PORTHUS','ARAMIS') THEN --USUARIOS PERMITIDOS
   RAISE_APPLICATION_EROOR(-20001,'VOCE NÃO PODE ALTERAR !!');
 END IF;
END;
/

 

Para log veja uma segustão publicada por mim aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta Motta,

 

Eu já havia tentado algo parecido mas ele não escreve de jeito nenhum na tabela de log. Será que existe outra forma de impedir o update que não seja o raise exeception error? Pelo que entendi dele, ele bloqueia qualquer insert, update e delete que esteja sendo feito pelo usuário, naquela sessão, naquele momento.

 

Att

 

 

A trigger poderia ser de before update e baseado numa regra impedir a operação.

 

Algo assim

 

CREATE OR REPLACE TRIGGER MINHA_TRIGGER BEFORE UPDATE IN MINHA_TABELA
IS

BEGIN
 IF USER NOT IN ('ATHUS','PORTHUS','ARAMIS') THEN --USUARIOS PERMITIDOS
   RAISE_APPLICATION_EROOR(-20001,'VOCE NÃO PODE ALTERAR !!');
 END IF;
END;
/

 

Para log veja uma segustão publicada por mim aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Pelo que entendi dele, ele bloqueia qualquer insert, update e delete que esteja sendo feito pelo usuário, naquela sessão, naquele momento.

 

Não, se a trigger for só de UPDATE ela só é chamada no UPDATE.

 

não escreve de jeito nenhum na tabela de log

 

Para "log" faça outra trigger, auqele gerador de script que publiquei gera um código de trigger que faz um log simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que me expressei mal:

 

A trigger realmente só é chamada conforme o tipo ao qual ela foi criada. Eu me referi que se você coloca um insert dentro da trigger e rola um raise exception o insert não é feito. Tentei fazer com duas triggers diferentes e também não fez o insert. A primeira startando a partir de um update(before e depois com after) na tabela que eu queria e fazendo um insert na tabela de log e a segunda sendo startada a partir do insert(before e depois com after) na tabela de log dando o raise exception. O problema, também, é que estou usando Oracle 10g e não posso impor a ordem com que as trigger são startadas, pois neste caso eu poderia criar as duas startando através do update da primeira tabela mas fazer o insert primeiro e dar o raise depois.

 

Não, se a trigger for só de UPDATE ela só é chamada no UPDATE.

 

 

 

Para "log" faça outra trigger, auqele gerador de script que publiquei gera um código de trigger que faz um log simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ordem não importa :

 

Triggers de log em geral ficam melhor como AFTER pois temos certeza que a operação foi feita.

 

Triggers de validação ficam melhor como BEFORE pois se der exeception aqui a operação não será feita.

 

Sempre é bom colocar operações deste tipo em uma transaction pois se algo der errado TUDO é desfeito.

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.