Auditoria de tabelas no Oracle

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
andremelim
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 28 Jan 2009 8:19 am
Localização: Rondonópolis - muito

Olá pessoal,

Gostaria de saber se tem como montar uma auditoria no Oracle de tal forma que ao inserir,alterar,excluir dados em uma tabela eu consiga gravar essas informações em uma tabela com uma estrutura parecida com esta:

seq_auditoria,nome_tabela,nome_campo,valor_anterior,valor_atual.

Porém eu precisaria fazer isto de uma maneira, digamos automática, sem ter que ficar passando campo por campo para uma funcao fazer o insert nesta tabela. Ou seja, o objetivo seria ter uma maneira de fazer isto de tal forma que quando se acrescente um novo campo na tabela, o procedimento de auditoria faça o insert na tabela sem eu ter que alterar o procedimento, pois da maneira tradicional (campo a campo) ficaria assim:

Selecionar tudo

create or replace triger upd_clientes
 after update on clientes                                                                                                   for each row                          
begin
  if :old.codcli <> :new.codcli then
     Gera_Auditoria('CLIENTES','CODCLI',:old.codcli,:new.codcli);
  end if;
  if :old.nome <> :new.nome then
     Gera_Auditoria('CLIENTES','NOME',:old.nome,:new.nome);

  ... etc
end;
Porém, desta maneira, sempre que eu criar um novo campo vou ter que alterar a trigger para gerar a auditoria deste campo, mas não é esse o objetivo.

Grato pela atenção!
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai Andre, beleza??

brow, a principio vejo 2 opções:

1) Na trigger da sua tabela você poderia fazer o DML dinamicamente, porem os campos você teria incluir em uma variavel antes de executar, e antes disso tb fazer um acesso a all_tab_columns... o q não acho nada performatico nesse caso... mas é possível...

2) Uma outra opção seria você criar uma trigger pra identificar sempre quem um novo objeto é criado/alterado no banco, se quiser tem mais infos aqui (http://psoug.org/reference/ddl_trigger.html). Nessa trigger você poderia ter uma rotina q montasse a sua trigger de auditoria, e nesse caso você já criaria ela com todos os campos que a tabela original possui, nesse caso ficando bem mais performatico.... essa segunda opção eu sei q dá pra fazer, em uma das empresas q passei existia uma tela onde poderiamos escolher se queriamos gerar a tabela de historico e tb pra qual evento ela iria servir (insert/delete/update)..

de cara pensei nessas 2 formas, não me lembro de outro jeito de se fazer isso dinamicamente..

Abraço!!!!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes