auditando 50 columnas usando el disparador de oracle
Necesito crear untrigger
enoracle 11g
Para auditar una mesa.
Tengo una mesa con50 columns
que necesita seraudited
.
every new insert
en una tabla, necesito poner una entrada enaudit table (1 row)
.porevery update
Supongamos que actualizo1st 2nd column
, entonces creará dos registros en auditoría con suold value and new value
.estructura de la tabla de auditoría será
id NOT NULL
attribute NOT NULL
OLD VALUE NOT NULL
NEW VALUE NOT NULL
cre_date NOT NULL
upd_date NULL
cre_time NOT NULL
upd_time NULL
En caso deinsert
, solo la clave primaria (tabla principal) es decir, la clave principalid
ycre_date and cre_time
necesita ser poblado yattribute
igual a*
, en caso de actualización, suponga que colA y colB se están actualizando, entonces todos deben completarse. En este caso, se crearán dos registros con el atributo del primer registrocolA
y correspondienteold and new
valor, y lo mismo para elcolB
Ahora mi solución para auditar esnot very optimized
, he creado unrow level trigger
, que verificará en cada una de las 50 columnas de esa tabla si ha sidochanged
o no basado en sunew and old value
(si -else), y llenará la tabla de auditoría. No estoy satisfecho con mi solución por eso estoy publicando aquí. Otra solución que he visto en el siguiente enlace:
http://stackoverflow.com/questions/1421645/oracle-excluding-updates-of-one-column-for-firing-a-trigger
Esto no está funcionando en mi caso, he hecho un POC para eso como se muestra a continuación:
create table temp12(id number);
create or replace trigger my_trigger
after update or insert on temp12
for each row
declare
TYPE tab_col_nt IS table of varchar2(30);
v_tab_col_nt tab_col_nt;
begin
v_tab_col_nt := tab_col_nt('id','name');
for r in v_tab_col_nt.first..v_tab_col_nt.last
loop
if updating(r) then
insert into data_table values(1,'i am updating'||r);
else
insert into data_table values(2,'i am inserting'||r);
end if;
end loop;
end;
En el caso de la actualización está llamando a la otra parte, no sé por qué. ¿Puede esto ser posible a través decompound trigger