hermesmc 0 Denunciar post Postado Fevereiro 17, 2012 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
Motta 645 Denunciar post Postado Fevereiro 22, 2012 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
hermesmc 0 Denunciar post Postado Fevereiro 23, 2012 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
Motta 645 Denunciar post Postado Fevereiro 23, 2012 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
hermesmc 0 Denunciar post Postado Fevereiro 23, 2012 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
Motta 645 Denunciar post Postado Fevereiro 23, 2012 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