Para aclarar algunos aspectos que SQL SERVER difiere de ORACLE
DATABASE en el uso de TRIGGERS:
SQL SERVER ORACLE DATABASE
Usa las tablas Usa las palabras :NEW INSERTED y DELETED y :OLD Usa únicamente AFTER Usa AFTER y UPDATE
1. SQL SERVER, crea dinámicamente (no sé dónde) las tablas
INSERTED y DELETED, con la finalidad de guardar los datos nuevos en la tabla INSERTED para el caso de los comandos INSERT y UPDATE o los datos antiguos en la tabla DELETED para el caso de los comandos UPDATE y DELETE. La palabra dinámicamente hace referencia por ejemplo si yo hago un INSERT a la base de datos en una tabla de 4 campos se crea la tabla INSERTED con cuatro campos y los valores que se especifique en el INSERT a través de la sentencia SELECT campo1, campo2, campo3, campo4 FROM INSERTED, los nombres de los campos en el SELECT debe coincidir con el nombre de los campos del comando INSERT que activo el trigger, para este caso; igualmente pasa cuando cualquier comando UPDATE o DELETE active un trigger, los campos que se hace referencia en el SELECT de la tabla INSERTED o DELETED corresponden a los campos del comando que activo el trigger.
INSERT INSERTED Se crea la tabla Dentro del
INSERTED con los TRIGGER se mismos campos hace un referenciados en SELECT a el INSERT y los la tabla valores INSERTED. INSERTED Se crea la tabla Dentro del INSERTED con los TRIGGER se campos hace un actualizados y SELECT a los nuevos la tabla valores INSERTED. especificados en el SET del UPDATE UPDATE. DELETED Se crea la tabla Dentro del DELETED con los TRIGGER se campos hace un actualizados y SELECT a los valores que la tabla tenían los campos DELETED. antes de ejecutar el UPDATE DELETE DELETED Se crea la tabla Dentro del DELETED con todos TRIGGER se los campos de la hace un tabla y los SELECT a valores que la tabla tenían los campos DELETED. antes de ejecutar el DELETE.
Como se puede observar en la tabla anterior el UNICO comando
que al ejecutarlo usa las dos tablas (INSERTED, DELETED) es el UPDATE. Así como ocurre en ORACLE DATABASE que cuando se ejecutaba el UPDATE se usa :NEW y :OLD.
2. Si utiliza la instrucción ROLLBACK al final del código del
trigger se deshace tanto el trigger como el comando SQL que activo el trigger, es decir, como si no hubiera hecho nada. 3. Si el comando INSERT, UPDATE o DELETE no afecta ninguna fila de todas maneras el trugger se ejecuta quedando vacias las tablas INSERTED, DELETED. 4. A continuación se encuentra un ejemplo de un trigger, probado previamente (analizarlo respecto a la teoría explicada anteriormente):
El objetivo del siguiente trigger se activa después (AFTER) de
hacer un UPDATE en la tabla de la base de datos llamada CUENTA (ON CUENTA), y dentro del trigger se encarga de insertar en una tabla de la base de datos llamada HISTORICOSALDOS cada actualización del saldo a determinada cuenta:
CREATE TRIGGER TR_HISTORIAL_SALDOS
ON CUENTA AFTER UPDATE AS BEGIN SET NOCOUNT ON; INSERT INTO HISTORICOSALDOS(ID_CUENTA,SALDO,FECHA_SALDO) SELECT COD_CUENTA,SAL_CUENTA,GETDATE() FROM inserted END El siguiente comando (UPDATE) es el que activa el anterior trigger:
UPDATE CUENTA SET SAL_CUENTA=SAL_CUENTA+100 WHERE COD_CUENTA=2