You are on page 1of 3

1

SQL SERVER TEMA: TRIGGERS, FUNCIONES

Los triggers son procedimientos que estn anexados a una tabla. El usuario no lo invoca, se ejecutan automticamente cundo se realiza una operacin de mantenimiento en la tabla. Pueden estar anexados a diferentes operaciones: UPDATE, DELETE, INSERT tr_shippers_todos tr_shippers_delete FOR AFTER INSTEAD (despus de ..) tr_shippers_insert tr_shippers_update

(antes de.)

1. Para realizar los ejercicios, instalar en su computadora la base de datos NORTWIND siguiendo el procedimiento indicado en prctica anterior. Crear el trigger tr_shippers_todos: CREATE TRIGGER tr_shippers_todos ON Shippers AFTER Insert, Delete, Update AS Print 'se ejecut el Trigger' GO Guardar el trigger. Los Triggers son procedimientos que no reciben parmetros ni son invocados de forma explicita. Al ejecutar indirectamente el Trigger se crean tablas temporales en forma implicita llamadas INSERTED y DELETED (con la copia de la estructura de la tabla, en este caso Shippers, donde se guarda el registro insertado). Al ejecutar un Trigger en forma implcita se inicia una transaccin TRANSSACTION). Probar el Trigger anterior: UPDATE Shippers SET CompanyName = GARCIA WHERE ShipperID = 4 Al ejecutar la instruccin anterior se muestra el mensaje: se ejecut el Trigger (BEGIN

2
(0 filas afectadas) Sale el mensaje configurado en el Trigger (se ejecut el Trigger) y luego (0 filas afectadas), puesto que la tabla tiene solo tres registros. 2. Modificar el Trigger anterior de modo que no acepte un determinado valor al insertar un registro: ALTER TRIGGER tr_shippers_todos ON Shippers AFTER Insert, Delete, Update AS DECLARE @nombre varchar(40) SELECT @nombre = CompanyName FROM INSERTED IF @nombre = 'GARCIA' BEGIN ROLLBACK TRANSACTION RAISERROR ('No acepto el valor GARCIA',16,1) END GO Probar el Trigger tratando de ingresar un registro cuyo valor del campo CompanyName sea GARCIA: INSERT INTO Shippers (ShipperID,CompanyName, Phone) VALUES (4, 'GARCIA', '99437009' ) Sale un mensaje color rojo: Servidor: mensaje 50000, nivel 16, estado 1, procedimiento tr_shippers_todos, lnea 10 No acepto el valor GARCIA Se ha generado un error personalizado al ejecutarse automticamente el Trigger. 3. Modificar el Trigger anterior: ALTER TRIGGER tr_shippers_todos ON Shippers AFTER Insert, Delete, Update AS DECLARE @nombre varchar(40) SELECT @nombre = CompanyName FROM INSERTED IF @nombre = 'GARCIA' BEGIN ROLLBACK TRANSACTION RAISERROR ('No asepto el valor GARCIA',16,1) END ELSE BEGIN DECLARE @telefono VARCHAR(24), @ID int

3
SELECT @ID = MAX(ShipperID) FROM Shippers SET @ID = @ID + 1 SELECT @nombre = CompanyName , @telefono = Phone FROM INSERTED INSERT INTO Shippers (ShipperID,CompanyName, Phone) VALUES (@ID, @nombre, @telefono ) END GO Probar el Trigger ingresando un registro a la tabla: INSERT INTO Shippers (ShipperID,CompanyName, Phone) VALUES (60, 'AVALOS', '99437009' ) Si luego ejecuta la instruccin: select * FROM Shippers encontrar que se han insertado dos registros. El primero, por tener valor del campo CompanyName diferente a GARCIA y el segundo es para comprobar que existe la tabla INSERTED donde se guarda momentneamente los valores insertados y de la que se lee los valores para volverlo a insertar en la tabla. Esta otra instruccin no se ejecuta: INSERT INTO Shippers (ShipperID,CompanyName, Phone) VALUES (62, 'GARCIA', '99437009' ) Ejercicio: 1. Crear una base de datos y una tabla llamada alumno que tenga como campos cdigo, nombre, telfono y especialidad. Considerar que el campo cdigo debe se auto numrico (IDENTITY). 2. Crear un Trigger que al ingresar el nombre ISMAEL QUIROGA PINTO salga un mensaje indicando que no es alumno. Como si insertar el registro, luego eliminarlo. 3. Ahora crear un trigger que al ingresar el valor de ISMAEL QUIROGA PINTO , salga el mensaje pero tambin no permita almacenar el registro. 4. Crear un Trigger que no permita ingresar solo la especialidad de COMPUTACION. 5. Crear un Trigger que no permita ingresar solo las especialidades de COMPUTACION, ENFERMERIA TECNICA y CONTABILIDAD.

You might also like