domingo, 7 de agosto de 2011

Trigger

¿QUÉ ES UN TRIGGER?

Un trigger(disparacdor o activador) define una acción que la base de datos siempre debería realizar cuando ocurre
algún tipo de acontecimiento que la afecta.


Ejercicios paso a paso Se utilizan para:

*mantener la integridad referencial.

*asegurar reglas de negocios complejas y

*auditar cambios en los datos.


Ejercicios paso a paso 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
.




Ejercicios paso a paso 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€.


Ejercicios paso a paso 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.


Ejercicios paso a paso 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;


No hay comentarios:

Publicar un comentario