Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Trigger dinámico para Auditoría de Tablas (https://www.clubdelphi.com/foros/showthread.php?t=46025)

jwmoreira 21-07-2007 01:27:59

Trigger dinámico para Auditoría de Tablas
 
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 :

Código:

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/show...350#post356350


La franja horaria es GMT +2. Ahora son las 10:01:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi