Ir para conteúdo

POWERED BY:

Arquivado

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

Rpizao

Interromper execução de uma trigger

Recommended Posts

Falai amigos(as),

Estou com o seguinte problema...

 

Tenho uma trigger qualquer, nela faço algumas verificações, inserts e tal...até ai tudo ok!

 

Eu gostaria (não sei se é possível) de que caso determinado evento ocorra, eu interrompa a trigger e retorne alguma flag pro sistema dizendo que aquilo ocorreu...para que no sistema eu possa fazer uma verificação do tipo

 

if (minha_trigger == "ERROR") message("Deu erro...");  OUif(!minha_trigger) message("Deu erro");

Outro ponto importante, mas eu acho que está implícito, e que do ponto onde eu interrompi a trigger para baixo nada seja executado...

 

Deu pra entender pessoal? Não sei se fui muito claro... :mellow:

 

Desde já, obrigado pela ajuda... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços...

Rafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi...

 

Existe a opção de você criar um outra trigger e nela espeficicar:

 

CREATE TRIGGER TESTE_ERROS

BEFORE SERVERERROR ON DATABASE

...

 

blá blá blá...

MONITORA SUA TRIGGER!

...

 

 

Eu não sei se isso te ajuda...

 

Abraços,

http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

hhhhuuummm....saquei velho....Essa trigger é acionada em qualquer erro?No caso, posso usar minha própria trigger e adicionar junto aos eventos de insert e update o de SERVERERROR tb?Ou tem que ser a parte?Deixa eu te dar mais detalhes do meu problema...Eu tenho uma trigger que valida informações como CPF, C/C, Agência e tal....se ela achar algum erro insere em uma tabela de erros...O problema que me passaram é o seguinte, todos os erros foram resolvidos (anteriores) apartir de agora, se usuário digitar alguma coisa errada vai acontecer a tal critica que chamará o relatório amostrando o erro...Vlw Alpha....já deu uma clareada...Abraços...Rafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maravilha...

 

Acho que então o SERVERERROR vai te ajudar, ele pega qualquer tipo de erro que ocorre no banco de dados independente do evento, seja ela uma trigger inválida ou problemas de INSERT e DELETE em alguma tabela.

 

Você pode montar uma tabela de erro guardando esses erros, erros do tipo ORA, PL e TNS e blá blá blá. e depois fazer um função, que varre essa tabela e verifica se a sua trigger ocorreu erro ou não, e dizer qual o tipo de erro foi aprensentado.

 

Essa função depois você pode schedular pelo DBMS_JOB para executar 3 vezes ao dia, e deixar seu relatorio atualizado tempos em tempos.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maravilha... Acho que então o SERVERERROR vai te ajudar, ele pega qualquer tipo de erro que ocorre no banco de dados independente do evento, seja ela uma trigger inválida ou problemas de INSERT e DELETE em alguma tabela. Você pode montar uma tabela de erro guardando esses erros, erros do tipo ORA, PL e TNS e blá blá blá. e depois fazer um função, que varre essa tabela e verifica se a sua trigger ocorreu erro ou não, e dizer qual o tipo de erro foi aprensentado. Essa função depois você pode schedular pelo DBMS_JOB para executar 3 vezes ao dia, e deixar seu relatorio atualizado tempos em tempos. Abraços, http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Shooooooooooooooooow Alpha...perfeito pro que eu quero!!!Vlw cara...desculpa pela demora...Abração...Rafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ih cara...não consegui resolver!!!É porque também, nesse caso, ele vai pegar erros de todas as tabelas né?!Tu pode me dar um exemplo usando nomes ficticios, pra mim ter uma idéia?Vlw parcero...até masRafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte Rafael,

 

Vou tentar passar um ALGORITMO e você tenta seguir.

 

Ao criar a trigger com SERVERERROR, ele irá pegar todos os erros da base de dados.

 

Então você cria uma TABELA para ele jogar todos os erros.

 

Nessa tabela você pode criar algumas colunas principais como:

 

NOME OBJETO

TIPO OBJETO

ERRO

DATA

 

Deste modo, o INSERT da sua TRIGGER com SERVERERROR irá preencher esses campos, e você depois com uma PROCEDURE ou FUNÇÃO poderá ler essa tabela e pegar somente TIPO OBJETO = TRIGGER e NOME OBJETO = SUA TRIGGER, assim você terá controle sobre os erros.

 

Será que assim deu para te ajudar ou ficou mais complicado.

 

Abraços, :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte Rafael,

 

Vou tentar passar um ALGORITMO e você tenta seguir.

 

Ao criar a trigger com SERVERERROR, ele irá pegar todos os erros da base de dados.

 

Então você cria uma TABELA para ele jogar todos os erros.

 

Nessa tabela você pode criar algumas colunas principais como:

 

NOME OBJETO

TIPO OBJETO

ERRO

DATA

 

Deste modo, o INSERT da sua TRIGGER com SERVERERROR irá preencher esses campos, e você depois com uma PROCEDURE ou FUNÇÃO poderá ler essa tabela e pegar somente TIPO OBJETO = TRIGGER e NOME OBJETO = SUA TRIGGER, assim você terá controle sobre os erros.

 

Será que assim deu para te ajudar ou ficou mais complicado.

 

Abraços, :P

hahahahaha....só faltou desenhar.... http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Entendi perfeitamente cara...eu ainda não tinha usado a opção SERVERERROR, aliás nem sabia que tinha trigger específica para o database... :unsure:

 

Obrigado Alpha... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços...

 

Rafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo Almeida , esta opção captura todo e qualquer erro do banco ?

 

E se já houver tratamento de exceções nas rotinas ?

 

Teria como escolher algumas tabelas ou tipos de erro/exceção ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá pessoal,

 

Motta!

 

Rodrigo Almeida , esta opção captura todo e qualquer erro do banco ?

 

R: O SERVERERROR ON DATABASE ele captura todos os erros em objetos do banco de dados, seja, uma TRIGGER, PROCEDURE, TABELA, INDEX e etc... você criando uma tabela de apoio a essa trigger você irá conseguir ter controle sobre todos os erros ocasionados no banco de dados. Funcionando como uma auditoria de erro. E caso você faça junções com views dinâmicas como v$session, poderá ter todas as informações e usuário que ocasiono o erro.

 

E se já houver tratamento de exceções nas rotinas ?

 

R: Ele também irá capturar o erro, caso seu bloco PL/SQL tenha Exceções, porque as exceções tratam somente dentro do seu bloco PL/SQL, podendo ou não emitir mensagem ao usuário. Sendo que, após gerar algum tipo de erro do tipo ORA, PL-SQL ou SP, a trigger irá detectar.

 

Teria como escolher algumas tabelas ou tipos de erro/exceção ?

 

R: Existe sim como você escolher quais OBJETOS você quer que seja "AUDITADO", no exemplo que passei ao Rafael, eu estou dizendo para o banco inteiro com a opção, ON DATABASE, mais vamos imaginar que eu queira para a tabela chamada RODRIGAO, então na trigger eu usaria a seguinte instrução:

 

 

CREATE TRIGGER RODRIGO SERVERERROR ON OWNER.RODRIGO BEGIN bla´blá blá END; /

Assim eu consigo controlar o erro sobre alguns objetos do banco.

 

Deu para entender pessoal, ou ficou meio complicado.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Po Rodrigo...gostei da explicação cara....

Só que o meu problema ainda ta meio "agarrado"...

Porque eu tenho uma tabela que guarda esses erros, só que eles são proveniente não de erros de execução e sim de validação de dados....ai que que eu queria fazer (não sei se é possível), quando encontrasse algum erro na validação ele interrompesse a trigger....retornando um raisererror alguma coisa assim...

 

Mas com relação a trigger anterior, ficou bem claro....vlw cara... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços... http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Rafael.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza Rafael,

 

Cara! Dá para você forçar o erro sim na sua validação, você terá que colocar uns IFs dentro das procedures e validar conforme o gosto do cliente.. hehehehhe...

 

No seu RAISE, você pode gerar um erro ORA-20001 ou ORA-20005, aí o servererror pegará esse erro da validação e jogará na sua tabela para tratamentos de erros.

 

E possível sim, eu não domino PL/SQL senão eu te ajudaria a criar essa procedure.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kra, pq você não põe uma check constraint na tabela que deve originar o erro, e valida os erros de constrant com a trigger que captura erro do servidor? Aí sempre que for erro de constraint você analisa se é da contraint q você criou, se for da um insert na tabela de erros e pronto.

 

Não sei se é esse o problema, mas pelo q eu intendi isso resolve.

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.