okdoc... Na verdade, enquanto especialista em tecnologia de RDBMS Oracle, o 
nosso trabalho é Alertar o cliente sobre os eventuais desdobramentos das opções 
escolhidas : se realmente, após vc explicar bem as restrições do solução 
programada (tal como mais código a manter, aus~encia de controle transacional, 
mais dificuldades referentes à multi-usuário e rollback de usuários, enfim, 
tudo o que foi dito), ainda assim o Cliente optar por assumir os riscos e fazer 
assim, vc cumpriu a obrigação, lava as mãos e faz como ele quer, só tomando o 
cuidado de Registrar por escrito (num e-mail, que seja) que se está seguindo 
por um caminho que pode não ser o mais recomendado, se der problema no futuro 
vc tem com o que se escudar...

 []s

  Chiappa


--- Em oracle_br@yahoogrupos.com.br, "Giovanni Ferreira de Sousa" 
<giovanni.sousa@...> escreveu
>
> Valeu pelas dicas, Paulo e Chiappa...
>  
> Vou conversar com o cliente, mais uma vez...embora ele esteja irredutível em 
> relação à utilização das TRIGGER...
>  
> Um 2012 repleto de realizações e conquistas....
>  
> Abraços
>  
> Giovanni.
> 
> ________________________________
> 
> De: oracle_br@yahoogrupos.com.br em nome de José Laurindo
> Enviada: qui 29/12/2011 18:55
> Para: oracle_br@yahoogrupos.com.br
> Assunto: [oracle_br] Re: Tratamento de logs
> 
> 
>   
> 
> 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 <mailto:oracle_br%40yahoogrupos.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 <mailto:oracle_br%40yahoogrupos.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 <mailto:oracle_br%40yahoogrupos.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 
> > > <mailto:oracle_br%40yahoogrupos.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 
> > > <mailto:oracle_br%40yahoogrupos.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]
> >
> 
> 
> 
> 
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a