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:
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;
Uma solução que tentei implementar, mas que não tive sucesso, foi usar o EXECUTE IMMEDIATE...fazendo da seguinte forma:
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;
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.