PDA

Ver la Versión Completa : Trigger dinámico para Auditoría de Tablas


jwmoreira
21-07-2007, 01:27:59
Hola a todos,

Actualmente realizo la auditoria de algunas tablas transaccionales desde triggers pero validando campo por campo:

If (old.campo1 <> new.campo1 ) ....

Esto se vuelve algo tedioso si la tabla es demasiado larga, ahora imaginense si le quiero hacer auditoria a todas las tablas del sistema, mi pregunta es, si existe algun forma de traer, estando dentro del evento update del trigger todos los nombres de los campos en forma de arreglo y poderlos recorrer con algun cursor o algo parecido?

Saludos,
Jorge.

TJose
21-07-2007, 02:35:19
Hola

Tengo un pequeño programa que escribí hace un tiempo, que hace (creo) lo que necesitas (genera el codigo sql)
Si quieres te lo paso

Saludos
TJose

jwmoreira
23-07-2007, 18:42:32
Hola, gracias seria muy bueno, por favor mi mail es el siguiente: jwmoreira@hotmail.com.

Saludos,
Jorge.

yakko_msm
31-01-2010, 16:56:48
Hola me podrias enviar el script a mi correo yakko_msm@hotmail. Estoy trabajando en algo similar y quiero ver si lo puedo mejorar.

Gracias
Saludos
Yakko

guillotmarc
31-01-2010, 19:20:40
Hola.

Utilizar un programa que te genere un SQL para construir los triggers, está muy bien, pero significa que cada vez que cambias un campo tendrás que reconstruir los triggers.

¿ No sería mejor crear un trigger que se adapte a los campos que tengas en cada momento ?, de esta manera, una vez creado el trigger ya te puedes olvidar de él, por más que modifiques la tabla.

Para ello, en el trigger tienes que recorrer (con un for select) las tablas de sistema, para ir obteniendo el nombre de los campos en la tabla, y para cada campo, utilizas una sentencia dinámica (con execute statement) para verificar si ha cambiado de valor.

NOTA: Esta consulta te devuelve todos los campos de una Tabla

select f.rdb$field_name
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
and f.rdb$relation_name = :TABLA
order by f.rdb$field_position

Saludos.

guillotmarc
31-01-2010, 19:27:34
Por cierto, la comparación que haces no me parece correcta :

if (old.campo1 <> new.campo1 ) then ....

Un campo vacío (null) es un estado y no un valor comparable. Eso hace que las comparaciones entre un null y un valor no siempre den lo que te esperas. Aunque es mucho más largo, deberías escribir :


if ((old.campo1 is null and new.campo1 is not null) or
(old.campo1 is not null and new.campo1 is null) or
(old.campo1 <> new.campo1 )) then ....

fjcg02
11-03-2010, 22:53:07
Hola,
habeis llegado a alguna conclusión ?

No consigo realizar lo mismo que estais comentando.

En qué puede fallar mi trigger ?

Saludos

http://www.clubdelphi.com/foros/showthread.php?p=356350#post356350