Sie sind auf Seite 1von 7

4/24/2014 ENI Training - Libro online

http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 1/7
Los triggers
SQL Server ofrece dos tipos de triggers: los triggers de DML y los de DDL.
Los triggers de DML existen desde hace mucho tiempo en SQL Server y estn presentes en muchas
bases de datos. Este es el tipo de trigger que se detalla aqu.
Los triggers de DDL se basan en el mismo principio, a saber, asociar la ejecucin de un procedimiento
almacenado a la ejecucin de una instruccin. En este caso, la particularidad es que el trigger va a estar
asociado a una instruccin DDL, es decir un comando CREATE, ALTER DROP, GRANT, DENY, REVOKE y
UPDATE STATISTICS. El objetivo de estos triggers es seguir la evolucin de la base de datos, para
realizar lo mejor posible las diferentes tareas de administracin.
Por esta razn, estos triggers no se abordan en este libro.
Un trigger de DML, que en adelante llamaremos simplemente trigger, se puede ver como un script
Transact SQL guardado en la base de datos, cuya ejecucin se asocia a eventos que hacen que se
activen. Estos eventos de activacin son los que permiten modificar los datos (INSERT, UPDATE o DELETE)
de una tabla o vista.
Los triggers permiten implementar reglas de gestin complejas que llaman a los datos presentes en
diferentes tablas o a clculos, ya que no es posible definir reglas de validacin como estas con la
restriccin CHECK. Los triggers permiten soportar la desnormalizacin de los datos para garantizar la
coherencia de los mismos. En un esquema normalizado, el motor SQL Server puede garantizar esta
coherencia. Pero si por alguna razn los datos se desnormalizan (repeticin de valores o datos
calculados), el responsable de esta desnormalizacin tambin debe prever el mecanismo que va a
garantizar que estos datos desnormalizados sigan siendo coherentes. Esta gestin pasa por los
triggers.
Al crear un trigger es necesario, adems de nombrarlo de manera nica, indicar cul es el evento y de
qu tabla o vista va a activar la ejecucin del cdigo Transact SQL asociado.
Un trigger se puede asociar a varios eventos (INSERT, UPDATE o DELETE), pero por el contrario, solo se
puede aplicar sobre una tabla o vista.
Un usuario nunca ejecuta voluntariamente un trigger. Cuando se modifican los datos es cuando se
ejecuta el cdigo del trigger asociado a la instruccin y tabla concretas. El trigger forma parte de la
instruccin inicial; si se produce un error durante la ejecucin, es toda la instruccin la que falla.
El trigger se ejecuta al ejecutar la instruccin SQL que lo ha activado, incluso si estn implicados varios
registros de datos. De esta manera, los datos que se insertan de nuevo, en el caso de un INSERT o de
un UPDATE, y los datos que se eliminan, en caso de un DELETE o de un UPDATE, estn disponibles en
unas tablas particulares, llamadas inserted y deleted respectivamente.
Estas tablas son particulares porque solo se puede acceder a ellas desde el cdigo del trigger. Estn
relacionadas al contexto de ejecucin de la consulta. Cuando se define un trigger, es conveniente definir
un cursor sobre una o las dos tablas anteriores, si el trigger quiere realizar un tratamiento sobre cada
registro.
Cuando un trigger se asocia a una tabla, se ejecuta despus de la verificacin de las restricciones de
integridad, por lo que no es posible modificar o corregir los datos de usuario, para que verifiquen las
restricciones definidas. Por el contrario, este tipo de trigger se adapta perfectamente al objetivo principal
de los triggers, que no es otro que permitir la definicin de restricciones complejas que implican la
intervencin de datos que provienen de varias tablas y/o que necesita la manipulacin de varios
registros.
Los triggers tienen peor rendimiento que las restricciones de integridad. Por tanto, es
conveniente recurrir a ellos solo en caso de que la regla de validacin no se pueda definir como
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 2/7
una restriccin de integridad.
Sobre las vistas, como sobre las tablas, es posible definir triggers de tipo INSTEAD OF. Como su nombre
indica, este trigger se ejecuta en lugar de la orden inicial. Cuando un trigger como este se define sobre
una vista, permite enviar la instruccin a la tabla o tablas subyacentes. Cuando se define sobre una
tabla, es posible completar o corregir los datos antes de ejecutar la instruccin que es necesario
reprogramar en el trigger.
Sintaxis
CREATE TRIGGER nombreTrigger ON { tabla | vista }
[ WITH ENCRYPTION ]
{FOR | AFTER | INSTEAD OF } { INSERT , UPDATE ,DELETE }
[ WITH APPEND ] [ NOT FOR REPLICATION ]
AS
[ IF UPDATE ( columna )
| IF ( COLUMNS_UPDATED ( )operadorComparacionBits)] InstruccionesSQL
WITH ENCRYPTION
La definicin del trigger se guarda de manera encriptada, por lo que no es posible conocer el
cdigo del trigger a posteriori. Esta opcin tambin evita que el trigger se publique en el
marco de una replicacin.
FOR
Permite indicar en qu orden SQL DML se asocia el trigger. Por defecto, el trigger es de tipo
AFTER.
AFTER
Es el modo por defecto de los triggers. El cdigo se ejecuta despus de verificar las
restricciones de integridad y de modificar los datos.
INSTEAD OF
El cuerpo del trigger se ejecuta en lugar de la orden SQL enviada a la tabla o vista. Este tipo
de trigger se adapta particularmente bien a las vistas.
INSERT, UPDATE, DELETE
Un trigger puede actuar respecto a una o varias acciones. En este caso, separaremos las
acciones por comas.
WITH APPEND
Esta clusula solo es necesaria si el nivel de compatibilidad de la base de datos es inferior o
igual a 65. Permite aadir varios triggers en un mismo orden SQL y objeto. Este es el
comportamiento por defecto desde la versin 7.0.
NOT FOR REPLICATION
Indica que el trigger no se debe ejecutar cuando la modificacin de los datos es consecuencia
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 3/7
de un proceso de replicacin.
IF UPDATE (columna)
Solo se puede usar para los triggers UPDATE o INSERT y solo se ejecutar si estn implicadas
la columna o columnas que se usan como argumento.
IF ( COLUMNS_UPDATED ( ) operadorComparacionBits)
Esta funcin permite conocer los ndices de la(s) columna(s) que hemos actualizado. Se
devuelve un bit para cada columna afectada por la actualizacin. Para saber qu columnas se
han actualizado, basta con una sencilla comparacin binaria.
InstruccionesSQL
Es posible utilizar todas las instrucciones Transact SQL de manipulacin de datos (DML). Las
siguientes instrucciones no estn autorizadas:
CREATE y DROP.
ALTER TABLE y ALTER DATABASE.
TRUNCATE.
GRANT y REVOKE.
UPDATE STATISTICS.
RECONFIGURE.
LOAD DATABASE.
Sobre una misma tabla, es posible definir varios triggers para cada operacin INSERT, UPDATE y DELETE.
Si la instruccin SQL falla, el trigger no se ejecuta.
El procedimiento almacenado sp_helptrigger permite conocer los triggers definidos sobre una
tabla.
Los triggers de tipo AFTER solo se pueden utilizar en tablas, no es posible usar un trigger como este
sobre las vistas. Es posible crear varios triggers AFTER para una misma tabla y un mismo orden SQL
(INSERT, UPDATE o DELETE) de activacin. Si existen varios triggers, el procedimiento
almacenadosp_settriggerorder permite fijar el trigger que se ejecutar en primer y ltimo lugar. Los
otros triggers se ejecutarn siguiendo un orden no establecido.
Si una tabla realiza una accin en cascada, ya no es posible tener un trigger INSTEAD OF.
SQL Server puede autorizar la recursividad de los triggers, si se ha activado la opcin de base de datos
recursive con ALTER DATABASE. Esta opcin permite dar un poder netamente superior a los triggers, pero
a veces puede ser peligroso usarla.
Entre la recursividad posible, hay que distinguir la recursividad directa de la recursividad indirecta.
La recursividad directa se gestiona con el argumento recursiveTriggers. Autoriza, por ejemplo, a un
trigger que acta sobre la tabla CLIENTES y que est asociado a la orden INSERT, a contener una orden
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 4/7
INSERT en esta misma tabla CLIENTES. Este segunda orden INSERT tambin activa la ejecucin del
trigger.
La recursividad indirecta se gestiona con el argumento de servidor nestedTriggers del
procedimientosp_configure. Para ilustrar la recursividad indirecta, consideremos un trigger sobre la tabla
de PEDIDOS, asociado a la orden INSERT. Imaginemos que provoca una orden INSERT en la tabla de
CLIENTES y que el trigger asociado provoca, a su vez, una orden INSERT sobre la tabla de PEDIDOS.
Para evitar bloqueos definitivos, los triggers no pueden tener ms de 32 niveles de anidamiento.
Ejemplos
Creacin automtica de una factura cuando cambia el estado del pedido:
Solicitud de creacin de un trigger sobre la tabla Pedidos desde SQL Server Management Studio:
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 5/7
Creacin de un primer trigger sobre la tabla Pedidos:
Creacin de un segundo trigger sobre la tabla Pedidos para calcular la tasa de descuento:
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 6/7
Conocer los triggers que actan sobre la tabla de pedidos:
Fijar el primer y ltimo trigger que se ejecutan durante cada operacin de INSERT, sobre la tabla de pedidos:
4/24/2014 ENI Training - Libro online
http://www.eni-training.com/client_net/mediabook.aspx?idR=68861 7/7

Das könnte Ihnen auch gefallen