campos de una tabla (trigger)

01/07/2004 - 14:16 por polo | Informe spam
se puede en un trigger recorrer cada campo de una tabla
para saber si se modifico o no?
(sin usar: if update nombre_columna)
existe una instruccion para saber cuales son los campos de
una tabla?

la idea es poder usarlo para auditoria.

muchas gracias.
 

Leer las respuestas

#1 Javier Loria
01/07/2004 - 16:07 | Informe spam
Hola:
Si se se puede, pero debes tenerle un poco de cuidado a estos triggers
todopoderosos, ya que es muy facil meterse en problemas en SQL cuando
mezclas los datos y los metadatos.
En todo caso, para obtener la lista de las columnas de una Tabla:
=SELECT Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='*** Tabla ***'
= Puedes otener otra informacion (tipo, default, si permite nulos, etc)
sobre las columnas en esta misma tabla.
El Trigger tiene tambien una funcion COLUMNS_UPDATED() que te da en un
VARBINARY los numeros de las columnas modificados. Antes fallaba mucho, pero
me parece que ya es totalmente confiable.
La lista de columnas que cambiaron en un Trigger puedes obtenerla con:
==SELECT Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='*** Tabla ***'
AND POWER(2,ORDINAL_POSITION-1)&COLUMNS_UPDATED() >0
== Eventualmente podrias construir una "Bitacora" de columnas modificadas
con algo como:
CREATE TABLE Auditable(
PK INT NOT NULL
PRIMARY KEY
, COL2 INT NOT NULL
, COL3 CHAR(5) NOT NULL
, COL4 NUMERIC(9,2) NOT NULL
)

CREATE TABLE BitacoraAuditoria(
Tabla SYSNAME NOT NULL
, FechaRegistro DATETIME NOT NULL
DEFAULT(CURRENT_TIMESTAMP)
, NumEvento INT NOT NULL
, Operacion CHAR(3)
, ColsUpd VARBINARY(8)
, Columnas VARCHAR(1000)
, CONSTRAINT PK_BitacoraAuditoria
PRIMARY KEY (Tabla, FechaRegistro, NumEvento)
)

INSERT Auditable(PK, Col2, Col3, Col4)
SELECT 1, 1, 'UNO', 1.0 UNION ALL
SELECT 2, 2, 'DOS', 2.0 UNION ALL
SELECT 3, 3, 'TRES', 3.0 UNION ALL
GO
CREATE TRIGGER Aud_Auditable
ON Auditable FOR UPDATE
AS
DECLARE @Columnas VARCHAR(1000)
SET @Columnas=''
SELECT @Columnas=@Columnas+','+Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='Auditable'
AND POWER(2,ORDINAL_POSITION-1)&COLUMNS_UPDATED() >0
SET @Columnas=RIGHT(@Columnas,LEN(@Columnas)-1)
INSERT BitacoraAuditoria(Tabla, NumEvento, Operacion, ColsUpd,Columnas)
SELECT 'Auditable'
, COALESCE(MAX(NumEvento),0)+1
, 'UPD'
, COLUMNS_UPDATED()
, @Columnas
FROM BitacoraAuditoria WHERE Tabla='Auditable'
GO
/* Pruebas */
UPDATE Auditable
SET Col2
WHERE PK=1

UPDATE Auditable
SET Col2", COL3='DDOS'
WHERE PK=2

UPDATE Auditable
SET COL23, COL43.0
WHERE PK=3
/* Bitacora */
SELECT * FROM BitacoraAuditoria

Espero te sirva


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.





polo escribio:
se puede en un trigger recorrer cada campo de una tabla
para saber si se modifico o no?
(sin usar: if update nombre_columna)
existe una instruccion para saber cuales son los campos de
una tabla?

la idea es poder usarlo para auditoria.

muchas gracias.

Preguntas similares