Yep .... Na verdade eu aproveitei o gancho pra discutir um pouco de postura técnica com o cliente, de detalhes como programação defensiva (aonde o cara pensou ao menos um pouco sobre controle de transação, sobre o que acontece se tiver um rollback inesperado, se tiver multi-usuários acessando o mesmo recurso, etc), espero que tenha sido útil lá pro colega ... Sobre a exception, realmente não vi o primeiro e-mail, mas se tá lá blz, fica a recomendação, junto com todas as outras feitas na thread, para caso o colega lá acabe optando por audit só dentro da proc dele...
[]s Chiappa --- Em oracle_br@yahoogrupos.com.br, Paulo Petruzalek <ppetruzalek@...> escreveu > > Concordo com tudo que você disse Chiappa, justamente por isso que reforcei na > minha mensagem que estou só mostrando como fazer, não que eu concordo com a > forma de ser feita. Eu coloquei a questão das exceptions no meu primeiro > e-mail, o segundo que você respondeu foi só uma correção para citar os > savepoints. > > De qualquer forma a solução por triggers certamente é a mais indicada... e se > eles não dispõem de um dba para controlar isso, a base deles já está correndo > o risco de dar todo tipo de problemas muito antes de que alguém reclame de > uma trigger inválida... > > []'s > > Paulo > > --- Em qui, 29/12/11, José Laurindo <jlchiappa@...> escreveu: > > > De: José Laurindo <jlchiappa@...> > Assunto: [oracle_br] Re: Tratamento de logs > Para: oracle_br@yahoogrupos.com.br > Data: Quinta-feira, 29 de Dezembro de 2011, 11:06 > > > Paulo, é absolutamente verdade que a maneira de desfazer apenas parte dos > comandos da transação é o SAVEPOINT - no caso em questão, porém, uma solução > procedural, além de ser mais longa, só vai ser disparada (óbvio) quando da > execução do PL/SQL, se outras rotinas/programas fizerem DELETEs na tabela > esses DELETEs passam SEM LOGS, e uma Auditoria em princípio deve pegar TODOS > os DMLs, independente de onde venham... Outra coisa é que o %rowcount pega os > casos de delete que não encontrou dados, MAS casos de erro efetivo no DELETE > (por exemplo, tentativa de eliminar PK com filhos presentes) ele não pega, > faltaria adicionar os EXCEPTIONS... > > Juntando isso com a necessidade (estranha, mas é um dado do problema) de só > auditar DELETEs bem-sucedidos, eu optaria por um TRIGGER DE DML, assim : > > create or replace trigger TRG_AUD_DEL after DELETE on nomedatabela > FOR EACH ROW > BEGIN > insert into tabeladelog(coluna1, coluna2, ... colunaN) > values(:old.coluna1, :old.coluna2, ... :old.colunaN); > END; > > ==> aí, além do código ser menor, a "auditoria" vai pegar QUALQUER DELETE na > tabela, seja ou não vindo do PL/SQL, como a trigger é AFTER (depois, em > inglês), ela automagicamente só dispara ** DEPOIS ** de um DELETE bem > sucedido, aí vc não precisa se preocupar no seu código de auditoria com > COMMITs/ROLLBACKs e ainda é transacional, ie, se depois do delete feito OK > alguém pedir ROLLBACK do DELETE a inserção na tabela de log não é registrada > - o colega não diz se isso é preciso mas pelo jeitão parece que sim ... > > Aliás, Giovani, coisas do tipo (ah, o que deve ser logado / o que deve > ocorrer ocorre se neguinho pedir ROLLBACK de um DELETE bem-sucedido, o que > deve ocorrer se alguém fazer DELETE fora do seu programa, o que deve ocorrer > se duas sessões pedirem DELETE do mesmo registro , etc, etc) é nossa parte, > enquanto técnicos especialistas em banco de dados, ter bem claro : o seu > Cliente com quase 100% de certeza não faz a MENOR IDÉIA dessas coisas, nem > imagina que o banco é MULTI-USUÁRIO, que podem haver erros de DELETE , etc, > então quando ele te pede "ah, me faz um log", é um des-serviço vc não o > avisar dessas coisas , não esclarecer bem a necessidade, o que ele quer que > aconteça em cada caso ... > > []s > > Chiappa > > > --- Em oracle_br@yahoogrupos.com.br, Paulo Petruzalek <ppetruzalek@> escreveu > > > > Complementando: acabei deixando na pressa o commit fora do if: > > > > If sql%rowcount = 0 then > > rollback; > > else > > commit; > > end if; > > > > Mas uma solução sem commits (dentro da sp) pode ser obtida com savepoints: > > > > begin > > savepoint A; > > insert into ... > > delete from ... > > if sql%rowcount = 0 then > > rollback to A; > > end if; > > end; > > / > > > > Neste caso o controle da transação ficará por conta do código chamador, sem > > o risco de commitar algo que não devia. > > > > Paulo > > > > --- Em qua, 28/12/11, Paulo Petruzalek <ppetruzalek@> escreveu: > > > > De: Paulo Petruzalek <ppetruzalek@> > > Assunto: Re: [oracle_br] Tratamento de logs > > Para: oracle_br@yahoogrupos.com.br > > Data: Quarta-feira, 28 de Dezembro de 2011, 22:27 > > > > Se for para tratar o caso de onde o delete não ocorre, basta fazer um: > > > > if sql%rowcount = 0 then > > rollback; > > end if; > > > > Agora no caso de "dar pau", você vai ter que instrumentar o código com um > > bloco exception. Exemplo simplificado: > > > > begin > > insert into log values (...) ; > > delete from tabela where x = ...; > > if sql%rowcount = 0 then rollback; > > end if; > > commit; > > > > exeception > > when others then rollback; > > end; > > / > > > > Talvez seja mais elegante declarar uma exceção e lançar ela no caso do > > sql%rowcount ser igual a 0... mas enfim, o estilo de código fica por sua > > conta e/ou pelas regras do seu projeto. > > > > Também note que deixar controle de transações (commit / rollback) dentro de > > uma sp pode causar muitos problemas se esta for chamada por outras sps. Eu > > não necessariamente usaria esta abordagem, só fiz o exemplo assim para > > ficar compatível com o seu código. > > > > Paulo > > > > --- Em qua, 28/12/11, Giovanni Ferreira de Sousa <giovanni.sousa@> escreveu: > > > > De: Giovanni Ferreira de Sousa <giovanni.sousa@> > > Assunto: [oracle_br] Tratamento de logs > > Para: oracle_br@yahoogrupos.com.br > > Data: Quarta-feira, 28 de Dezembro de 2011, 10:56 > > > > Bom Dia galera, > > > > > > Estou com a seguinte situação aqui no trabalho: > > > > Um usuário solicitou que para as deleções físicas no banco, esses registros > > deletado deveriam ser armazendos em uma tabela de log. No schema da > > aplicação existe uma procedure que faz o delete nas tabelas. Para atender a > > demanda do usuário foi adicionado na procedure o insert na tabela de log, > > baseado no registro que será deletado, como segue no exemplo abaixo. Sendo > > assim gostaria da ajuda de vocês para o seguinte: > > > > Após o INSERT é feito o DELETE. > > > > SE o DELETE der PAU ou não for feito. Como faço pra dar ROLLBACK(no INSERT > > anterior)? > > > > > > > > CREATE OR REPLACE PROCEDURE DBSISMAC.sp_solicitacao_remanej_final ( > > estado IN NUMBER, > > usuario IN NUMBER, > > competencia IN NUMBER, > > DS_USERNAME IN VARCHAR2) > > IS > > BEGIN > > INSERT INTO DBSISMAC.TL_TMQUADRO_06 > > SELECT competencia AS NU_COMPETENCIA_SOLICITACAO, > > CO_GESTAO, > > CO_MUNICIPIO_IBGE, > > CO_CNES, > > NO_UNIDADE, > > NU_CONTRATO, > > DT_PUBLIC_EXT_CONTRATO, > > VL_TOTAL_FNS, > > CO_PROTOCOLO, > > CO_USUARIO, > > DT_ALTERACAO, > > DS_USERNAME AS DS_USERNAME, > > 'EXCLUÍDO' AS DS_OPERACAO, > > SYSDATE AS DT_OPERACAO > > FROM DBSISMAC.TM_QUADRO_06 > > WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado; > > > > DELETE FROM DBSISMAC.TM_QUADRO_06 > > WHERE SUBSTR (CO_MUNICIPIO_IBGE, 0, 2) = estado; > > COMMIT; > > END; > > / > > > > Atenciosamente, > > > > Giovanni > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > ------------------------------------ > > > > -------------------------------------------------------------------------------------------------------------------------- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > >inteira responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > -------------------------------------------------------------------------------------------------------------------------- > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure > > >» Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > > >http://www.oraclebr.com.br/ > > ------------------------------------------------------------------------------------------------------------------------ > > Links do Yahoo! Grupos > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > ------------------------------------ > > > > -------------------------------------------------------------------------------------------------------------------------- > > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > > >inteira responsabilidade de seus remetentes. > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > > -------------------------------------------------------------------------------------------------------------------------- > > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure > > >» Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > > >http://www.oraclebr.com.br/ > > ------------------------------------------------------------------------------------------------------------------------ > > Links do Yahoo! Grupos > > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > ------------------------------------ > > -------------------------------------------------------------------------------------------------------------------------- > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira > >responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > -------------------------------------------------------------------------------------------------------------------------- > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » > >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > >http://www.oraclebr.com.br/ > ------------------------------------------------------------------------------------------------------------------------ > Links do Yahoo! Grupos > > > > > [As partes desta mensagem que não continham texto foram removidas] >