3. DEFINICIÓN:
Un desencadenador (o Trigger) es una clase especial de procedimiento almacenado que se ejecuta
automáticamente cuando se produce un evento en el servidor de bases de datos.
Los Triggers o Disparadores son objetos que se asocian con tablas y se almacenan en la base de datos.
Su nombre se deriva por el comportamiento que presentan en su funcionamiento, ya que se ejecutan
cuando sucede algún evento sobre las tablas a las que se encuentra asociado. Los eventos que hacen
que se ejecute un trigger son las operaciones de inserción (INSERT), borrado (DELETE) o actualización
(UPDATE), ya que modifican los datos de una tabla.
La utilidad principal de un trigger es mejorar la administración de la base de datos, ya que no requieren
que un usuario los ejecute.
Los triggers pueden prevenir errores en los datos, modificar valores de una vista, sincronizar tablas,
entre otros.
4. SQL Server permite crear varios desencadenadores para una instrucción específica.
Según el tipo de evento que los desencadena se clasifican en:
Desencadenadores DML
Desencadenadores DDL
Desencadenadores LOGON
Los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un
evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT,
UPDATE o DELETE de una tabla o vista.
Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de
definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE,
ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que
ejecutan operaciones de tipo DDL.
Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se
establece la sesión de un usuario.
5. COMPONENTES:
La estructura básica de un trigger es:
Llamada de activación: Es la sentencia que permite "disparar" el código a ejecutar.
Restricción: Es la condición necesaria para realizar el código. Esta restricción puede ser de tipo
condicional o de tipo nulidad.
Acción a ejecutar: Es la secuencia de instrucciones a ejecutar una vez que se han cumplido las
condiciones iniciales.
TIPOS:
Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:
Row Triggers (o Disparadores de fila): Son aquellas que se ejecutaran cada vez que se llama
al disparador desde la tabla asociada al trigger.
Statement Triggers (o Disparadores de secuencia): Son aquellos que sin importar la cantidad
de veces que se cumpla con la condición, su ejecución es única.
6. SINTAXIS:
Esta instrucción nos permite definir un trigger:
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::= assembly_name.class_name.method_name
7. ADMINISTRACIÓN DE ACTIVADORES (Creación, Modificación y Eliminación):
Creación de un Activador:
CREATE TRIGGER [NombreEsquema.]NombreTrigger
ON {tabla | vista } [,...n] ]
{FOR|AFTER|INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]}
AS sentencia_sql [;] [,...n ]
Modificación de un Activador:
Permite modificar la definición del desencadenador, no permite cambiar su nombre, para
cambiar el nombre de un desencadenador hay que eliminarlo (DROP TRIGGER) y volver a
crearlo (CREATE TRIGGER).
ALTER TRIGGER [NombreEsquema.]NombreTrigger
ON {tabla|vista}
{FOR|AFTER|INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]} [WITH APPEND]
AS sentencia_sql [;] [,...n ]
8. Ejemplo:
ALTER TRIGGER ActualizaVentasEmpleados
ON pedidos FOR INSERT
AS
UPDATE empleados SET ventas=ventas+inserted.importe
FROM empleados, inserted
WHERE numemp=inserted.rep AND inserted.importe IS NOT NULL;.
Eliminación de un Trigger:
Para eliminar un desencadenador tenemos la instrucción DROP TRIGGER elimina la definición
del desencadenador.
DROP TRIGGER NombreEsquema.NombreTrigger [,...n] [;]
Ejemplo:
DROP TRIGGER ActualizaVentasEmpleados
9. EJEMPLOS:
Trigger para insertar un pedido de un producto cuando la cantidad de éste, en nuestro almacén,
sea inferior a un valor dado.
CREATE TRIGGER TR_ARTICULO
ON ARTICULOS
AFTER UPDATE
AS
BEGIN
INSERT INTO HCO_ARTICULO
(IDARTICULO, STOCK, FECHA)
SELECT ID_ARTICULO, STOCK, GETDATE()
FROM INSERTED
END
INSERT INTO ARTICULOS VALUES (1, 'MEMORIA', 12, '12/03/2014')
SELECT * FROM ARTICULOS
UPDATE ARTICULOS
SET STOCK = STOCK - 20
WHERE ID_ARTICULO = 1
SELECT * FROM HCO_ARTICULO
10. Cree un activador que emita un error cuando se produzca una actualización que daría como
resultado un aumento de salario mayor que el diez por ciento del salario actual.
CREATE TRIGGER RAISE_LIMIT
AFTER UPDATE OF SALARY ON EMPLOYEE
REFERENCING NEW AS N OLD AS O
FOR EACH ROW
WHEN (N.SALARY > 1.1 * O.SALARY)
SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT ='Salary increase>10%'
11. RESUMEN:
Un "trigger" (disparador o desencadenador) es un tipo de procedimiento almacenado que se ejecuta
cuando se intenta modificar los datos de una tabla (o vista).
Un trigger se define para una tabla (o vista) específica, se crean para conservar la integridad referencial y
la coherencia entre los datos entre distintas tablas. Si se intenta modificar (agregar, actualizar o eliminar)
datos de una tabla en la que se definió un disparador para alguna de estas acciones (inserción,
actualización y eliminación), el disparador se ejecuta (se dispara) en forma automática.
Un trigger se asocia a un evento (inserción, actualización o borrado) sobre una tabla.
La diferencia con los procedimientos almacenados del sistema es que los triggers:
No pueden ser invocados directamente; al intentar modificar los datos de una tabla para la que se ha
definido un disparador, el disparador se ejecuta automáticamente.
No reciben y retornan parámetros.
Son apropiados para mantener la integridad de los datos, no para obtener resultados de consultas.
12. Los disparadores, a diferencia de las restricciones "check", pueden hacer referencia a campos
de otras tablas. Por ejemplo, puede crearse un trigger de inserción en la tabla "ventas" que
compruebe el campo "stock" de un artículo en la tabla "articulos"; el disparador controlaría que,
cuando el valor de "stock" sea menor a la cantidad que se intenta vender, la inserción del nuevo
registro en "ventas" no se realice.
Los disparadores se ejecutan DESPUES de la ejecución de una instrucción "insert", "update" o
"delete" en la tabla en la que fueron definidos. Las restricciones se comprueban ANTES de la
ejecución de una instrucción "insert", "update" o "delete". Por lo tanto, las restricciones se
comprueban primero, si se infringe alguna restricción, el desencadenador no llega a ejecutarse.
Los triggers se crean con la instrucción "create trigger". Esta instrucción especifica la tabla en la
que se define el disparador, los eventos para los que se ejecuta y las instrucciones que
contiene.
13. Sintaxis básica:
create triggre NOMBREDISPARADOR
on NOMBRETABLA
for EVENTO- insert, update o delete}
as
SENTENCIAS
Análisis la sintaxis:
"create trigger" junto al nombre del disparador.
"on" seguido del nombre de la tabla o vista para la cual se establece el trigger.
Luego de "for", se indica la acción (evento, el tipo de modificación) sobre la tabla o vista que
activará el trigger. Puede ser "insert", "update" o "delete". Debe colocarse al menos UNA acción,
si se coloca más de una, deben separarse con comas.
Luego de "as" viene el cuerpo del trigger, se especifican las condiciones y acciones del
disparador; es decir, las condiciones que determinan cuando un intento de inserción,
actualización o borrado provoca las acciones que el trigger realizará.
14. RECOMENDACIONES:
"create trigger" debe ser la primera sentencia de un bloque y sólo se puede aplicar a una
tabla.
Un disparador se crea solamente en la base de datos actual, pero puede hacer referencia
a objetos de otra base de datos.
Las siguientes instrucciones no están permitidas en un desencadenador: create database,
alter database, drop database, load database, restore database, load log, reconfigure,
restore log, disk init, disk resize.
Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificación
(inserción, actualización o borrado) para una misma tabla. Por ejemplo, se puede crear un
"insert trigger" para una tabla que ya tiene otro "insert trigger".
15. CONCLUCIONES:
Los triggers o disparadores son objetos de la base de datos que ejecutan acciones
cuando se producen ciertos eventos (tanto DML como DDL) (inserciones, modificaciones,
borrados, creación de tablas, etc).
Los Triggers son usados para mejorar la administración de la Base de datos, sin
necesidad de que el usuario ejecute la sentencia de SQL. Además, pueden generar
valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de
una vista, etc.
Un trigger es una clase especial de procedimiento almacenado que se ejecuta
automáticamente cuando se produce un evento en el servidor de bases de datos.
16. APRECIACIÓN DEL EQUIPO:
En los triggers no aceptan parámetros o argumentos (pero podrían almacenar los
datos afectados en tablas temporales)
Los triggers pueden causar errores de mutaciones en las tablas, si se han escrito de
manera deficiente.
Los triggers solo se pueden aplicar a una tabla específica, es decir, un trigger no
sirve para dos o más tablas
El trigger se crea en la base de datos donde se trabaja, pero desde un trigger
puedes hacer referencia a otras bases de datos.
Un Trigger devuelve resultados al programa que lo desencadena de la misma forma
que un Stored Procedure aunque no es lo más idoneo, para impedir que una
instrucción de asignación devuelva un resultado se puede utilizar la sentencia SET
NOCOUNT al principio del Trigger.