1. 1
SQL SERVER
TEMA: TRIGGERS, FUNCIONES
Los triggers son procedimientos que están anexados a una tabla. El usuario no lo
invoca, se ejecutan automáticamente cundo se realiza una operación de
mantenimiento en la tabla.
Pueden estar anexados a diferentes operaciones: UPDATE, DELETE, INSERT
tr_shippers_todos tr_shippers_insert tr_shippers_update
tr_shippers_delete
FOR … AFTER (después de ..)
INSTEAD (antes de….)
1. Para realizar los ejercicios, instalar en su computadora la base de datos
NORTWIND siguiendo el procedimiento indicado en práctica 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 parámetros 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 implícita se inicia una transacción (BEGIN
TRANSSACTION).
Probar el Trigger anterior:
UPDATE Shippers SET CompanyName = ‘GARCIA’ WHERE ShipperID = 4
Al ejecutar la instrucción anterior se muestra el mensaje:
se ejecutó el Trigger
2. 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,
línea 10
No acepto el valor GARCIA
Se ha generado un error personalizado al ejecutarse automáticamente 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. 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 instrucción:
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 momentáneamente los valores
insertados y de la que se lee los valores para volverlo a insertar en la tabla.
Esta otra instrucción 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 código, nombre, teléfono y especialidad. Considerar que el campo
código debe se auto numérico (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 también 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.