Todos os atributos de uma tabela na trigger em uma variavel

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
Pablo
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 190
Registrado em: Sex, 27 Out 2006 11:12 am
Localização: 88350000
Pablo

Bom dia galera. Tranquilos?!
Preciso da ajuda dos mestres.
Estou querendo criar uma auditoria de uma determinada tabela. Todos os atributos alterados precisam ser registrados, estou querendo atribuir todos os atributos da tabela em uma variável, mas, pelo o que eu vi, precisa ser feito atributo por atributo gerando muitas linhas...gostaria de criar algo mais dinâmico.
Por exemplo:
Gostaria de fazer algo assim:

Selecionar tudo

Declare
   aud_new   TABELA_A % rowtype;
   aud_old    TABELA_A % rowtype;
begin
   aud_new := :new;
   aud_old  := :old;
  
   procedure_monta_log_comparando ( aud_new, aud_old);
end;
Porém, o que li até agora, é que preciso atribuir atributo por atributo...ai, toda vez que incluir um novo atributo na tabela, terei que dar manutenção nesta trigger.

Uma solução que tentei implementar, mas que não tive sucesso, foi usar o EXECUTE IMMEDIATE...fazendo da seguinte forma:

Selecionar tudo

declare
   xScript        varchar2(2000);
   aux            varchar2(1) := chr(10);
   xObs           varchar2(100);
   xlog           varchar2(4000); 
begin
   for i in (select ':old.'||colunas.column_name nome_atrib_antigo,
                    ':new.'||colunas.column_name nome_atrib_novo
             from user_tables tabela,   
                 user_tab_columns colunas   
             where tabela.table_name = colunas.table_name   
               and tabela.table_name = 'TABELA_AUDITADA'  ) loop
      xScript := 'select ''Atualizado de '''||i.nome_atrib_antigo||'''para '''||i.nome_atrib_novo||''''||aux||
                 'from dual'||aux||
                 'where '||i.nome_atrib_antigo||' <> '||i.nome_atrib_novo||aux;
      execute immediate xScript into xObs;
      if xObs is not null then
         xlog := xlog||aux||xObs;
      end if;
   end loop;
   if trim(xlog) is not null then
      procedure_que_insere_log(xlog);
   end if;
end;
Isso não retorna o valor do atributo, somente o nome da coluna...e isso não me ajuda.

Estes dois códigos estão dentro de uma trigger.

Se alguém tiver alguma ideia de como posso deixar isso dinâmico sem precisar dar manutenção a cada atributo inserido,,,

Obrigado

PS.: Não compilei este script, então, ignorem os erros de aspas, finalização de comando, etc.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Muito tempo atrás eu fiz um programa que "monta" as triggers baseado nas colunas. (ALL_TAB_COLUMNS).
Eu tinha exatamente o mesmo objetivo que você.

Meu programa gerava um "CREATE TRIGGER...." com todo o código.
Daí bastava executar e criar as triggers pra N tabelas.

Infelizmente, foi a maneira que eu achei pra resolver esse problema. (lá em 2002).
Concordo que seria interessante ter um ARRAY com essas informações.

Veja que nesse post o cara dá a mesma solução que eu: Criar um programa que monta tudo :-(
https://stackoverflow.com/questions/290 ... cle-pl-sql
Responder
  • Informação
  • Quem está online

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