Auditoria de Datos

CREATE OR REPLACE TRIGGER AUD_AA_ANTONIO
AFTER DELETE OR INSERT OR UPDATE
ON gesafin.AA_ANTONIO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
DECLARE
Var_Tabla Varchar2(50):='AA_ANTONIO';
Cadena_old Varchar2(32767);
Cadena_new Varchar2(32767);
CURSOR CUR_Tabla is
Select *
From SYS.DBA_tab_columns t
Where owner = 'GESAFIN' and table_name = Var_Tabla
Order by t.COLUMN_ID;
BEGIN
IF (INSERTING OR UPDATING OR DELETING)
THEN
FOR reg_Tabla IN CUR_Tabla LOOP
Begin
Cadena_new := Cadena_New || '|' || reg_Tabla.Column_Name;
Cadena_old := Cadena_old || '|' || reg_Tabla.Column_Name;
End;
End Loop;
PKG_AUDITORIA_TRANSACCIONES.P_AUDITORIA_TRANSACCIONES (Var_Tabla, :old.AUDITORIA1, Cadena_old, Cadena_new);
END IF;
END aud_AA_ANTONIO;
END;
-- Lo que se trata es de concatenar los valores nuevos y viejos de los datos de los campos de la tabla
en la sentencia Cadena_New := Cadena_New || '|' || reg_Tabla.Column_Name;
Queriendo que reg_Tabla.Column_Name fuese reg_Tabla.:New.Column_Name

1 respuesta

Respuesta
1
Sin analizar la lógica de la rutina, cuando trabajas con Triggers transaccionales (Insert, Before, Update) bien sea After o Before, Oracle siempre guarda una imagen previa antes de cada cambio, y la imagen nueva es el cambio realizado.
Tal como muestras en la definición del Trigger "REFERENCING NEW AS NEW OLD AS OLD", cada columna de la tabla auditada objeto de algún cambio, la podrás consultar su "Before Image" y "After image" como:
Old. Columna1 - new. Columna1, old. Columna2 - new. Columna2.
Asi que si quieres ver el anterior valor de cualquier columna, como por ejempolo "nombre", solo colocas old. Nombre y el nuevo valor: new. Nombre.
Lo que quiero incluir en la variable Cadena_New son los datos contenidos en cada campo.
Lo que quiero saber es como pongo la sentencia para que me tome el valor nuevo en cadena_new y viejo en cadena_old, para incluir esos datos del registro .
¿Cuál es tu pregunta?
Tengo la version 9.2.0.1 y te agradecería que me enviases algún ejemplo de la funcionalidad AUDIT.
Y muchas gracias por todo
Ok, deseas hacer una única lógica de programación para cada trigger en cada tabla.
DEjame decirte que estas tomando el camino más largo y complicado, realmente no creo que se pueda, ya que la programación del trigger, para lo que deseas realizar debe ser ajustada a cada tabla. Oracle, para facilitar el tema de las auditorías masivas (varias tablas) posee una funcionalidad de "AUDIT", que puedes realizarla, en líneas generales (según la versión), sobre todo un esquema, un usuario, una tabla, bien sea a Disco Duro o a otra tabla en BD. Dime que versión tienes de Oracle y si no estas familiarizado con el AUDIT para darte un ejemplo.
Primeramente te recomiendo hacer un upgrade a la versión de 9.2.0.7, ya que la que tienes instalada es muy inestable.
Para activar la auditoría, puede hacerlo de diferentes formas:
Antes que nada debes colocar en el init.ora, el parámetro AUDIT_TRAIL=(none,db,os). Si define "db" las auditorías se guardaran en la tabla de sys.aud$. Por lo cual es recomendable borrarla periodicamente.
Las otras formas son más detalladas y es directamente por comandos, podría ser al nivel de esquema, cuenta de usuario, acción, objecto, etc.
Para lo que tu quieres, podría servir el siguiente ejemplo: audit [insert|update|all] on owner.table;
Lo anterior no registrará los cambios que se hayan realizado sobre la tabla, sino solamente la acción (sin detalles). Para registrar los detalles de auditoría (columnas modificadas, debes usar el package DBMS_FGA. [add_policy|drop_policy|enable_policy|disable_policy].
En resumen, la auditoría es muy extensa, te recomiendo leer más sobre ella, analizar que quieres y como puedes implementarlo. Si aún lo deseas te puedo enviar información a un email, solo dámelo y te lo envío, o también puedes adquirir un libro de Adm de Oracle 9i.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas