¿QUÉ ES UN TRIGGER?Un trigger(disparacdor o activador) define una acción que la base de datos siempre debería realizar cuando ocurrealgún tipo de acontecimiento que la afecta. Se utilizan para: *mantener la integridad referencial. *asegurar reglas de negocios complejas y
*auditar cambios en los datos. Para definir un trigger se debe: *Especificar las condiciones bajo las que el trigger será ejecutado. *Especificar las acciones que se realizarán cuando el trigger se ejecute. Las acciones del trigger se definen mediante bloques de PL/SQL nominados con las secciones: *Declarativa
*Ejecutable
*Manejo de excepciones *Los triggers se almacenan en la BD y están asociados a una tabla.
*Pueden afectar a n filas.
*Se ejecutan de manera implícita ante eventos(operación de inserción, modifiación o borrado)
*Se compilan cada vez que se activan. SINTAXIS DE UN TRIGGER: Esta instrucción nos permite definir un trigger:CREATE TRIGGER [NombreEsquema.]NombreTrigger
ON {tabla | vista } [,...n] ]
{FOR|AFTER|INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]}
AS sentencia_sql [;] [,...n ]
Cuando se INSERTe un pedido, entrará en funcionamiento el trigger ActualizaVentasEmpleado y se ejecutarán las instrucciones que aparecen después de AS, en este caso actualizará (UPDATE) la tabla empleados sumará a las ventas del empleado (ventas) el importe del pedido insertado (inserted.importe), y sólo actualizará el empleado cuyo numemp coincida con el campo rep del pedido insertado (WHERE numemp=inserted.rep).
-- Ahora comprobamos que funciona
SELECT * FROM empleados WHERE numemp=108;
INSERT INTO pedidos (numpedido,fechapedido,rep,clie,cant,importe,fab,producto)
VALUES (123456789,getdate(),108,2103,10,100,'Aci',41001)
SELECT * FROM empleados WHERE numemp=108;
Vemos que al insertar un pedido de 100 € del empleado 108, sus ventas han aumentado en 100€.
ALTER TRIGGER
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 ]
La sintaxis es similar a la instrucción CREATE TRIGGER.
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;
Hemos modificado el desencadenador para que si el importe del pedido es nulo, no haga nada, no actualice con un valor nulo.
DISABLE TRIGGER
En ocasiones puede ser útil inhabilitar temporalmente un desencadenador sin que por ello suponga eliminarlo, para estos casos podemos utilizar la sentencia DISABLE TRIGGER.
DISABLE TRIGGER {[NombreEsquema.]NombreTrigger [,...n] | ALL }
ON {NombreTablaVista | DATABASE | ALL SERVER} [;]
Ejemplo:
DISABLE TRIGGER ActualizaVentasEmpleado ON pedidos;
Deshabilita el desencadenador que hemos creado anteriormente, si después de ejecutar esta sentencia se introduce un nuevo pedido, el empleado correspondiente no se actualizará.
Lo podemos comprobar con:
SELECT * FROM empleados WHERE numemp=108;
INSERT INTO pedidos (numpedido,fechapedido,rep,clie,cant,importe,fab,producto)
VALUES (123456791,getdate(),108,2103,10,300,'Aci',41001)
SELECT * FROM empleados WHERE numemp=108;
DISABLE TRIGGER ALL ON pedidos;
Deshabilita todos los desencadenadores asociados a la tabla pedidos:
DISABLE TRIGGER ALL ON DATABASE;
Deshabilita todos los desencadenadores definidos en la base de datos actual,deshabilita todos los desencadenadores definidos en el servidor:
DISABLE TRIGGER ALL ON ALL SERVER;
Eliminar un trigger:
DROP TRIGGER nombre_disparador;
Esta instrucción te permite ver los errores de compilacion:
SHOW ERREOS TRIGGER nombre_disparador;