Unidad 9. Programación en TRANSACT SQL (IX)


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.

Ejercicios paso a paso Realiza el siguiente Ejercicio Triggers para practicar la creación de desencadenadores.

9.13. 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.


    DISABLE TRIGGER ALL ON ALL SERVER; 

Deshabilita todos los desencadenadores definidos en el servidor.

Febrero-2010
Pág. 9.9

Atrás  Inicio  Adelante






.