FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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. |
#2
|
|||
|
|||
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 |
#3
|
||||
|
||||
Hola, gracias seria muy bueno, por favor mi mail es el siguiente: jwmoreira@hotmail.com.
Saludos, Jorge. |
#4
|
|||
|
|||
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 |
#5
|
||||
|
||||
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. Última edición por guillotmarc fecha: 31-01-2010 a las 20:23:44. |
#6
|
||||
|
||||
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 .... |
#7
|
||||
|
||||
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
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Sistema de Huellas (Pistas de auditoria) | Hagen | Firebird e Interbase | 3 | 29-03-2011 14:47:12 |
Cambio dinamico de BD en delphi para sacar reporte Crystal | Jovana Macias | Impresión | 1 | 10-05-2007 20:27:00 |
Triggers de auditoria en firebird 1.5 | robertoe | Firebird e Interbase | 1 | 04-01-2007 05:18:11 |
Como crear menu dinamico para ventanas creadas | marcoev | Varios | 9 | 05-07-2005 21:54:07 |
Trigger Para Refrescar Tablas | GIVO | SQL | 5 | 21-07-2003 20:32:55 |
|