Escolar Documentos
Profissional Documentos
Cultura Documentos
Laboratorio Nro. 4
TRIGGERS
EN SQLSERVER
Objetivo:
El presente laboratorio tiene por objeto comprender, aplicar, practicar y ejercitar Triggers en
SQLServer.
A. Instructivo
Utilizando la Base de Datos DBAjedrez (creada en el laboratorio I), escribir los triggers en
SQLServer para la base de datos Ajedrez, ésta debe contener los datos necesarios, además
debe insertar en su base de datos, los datos representativos para mostrar el resultado de cada
función.
Un nuevo supuesto semántico surgido por la necesidad de conocer el monto total erogado
por el hospedaje de cada participante, ha dado lugar a incluir una nueva tabla de
habitaciones. Cada participante del campeonato de ajedrez se alquila una habitación en un
hotel, se desea conocer a qué precio se alquiló, de que tipo es cada una de estas habitaciones
(individuales, dobles, triples), si poseen cuarto de baño (privado o compartido). Por tanto la
tabla que debe incluir es:
HABITACIONES(
cod_hotel numeric(18) not null,
nro_habitacion numeric(18) null,
tipo varchar(20) null,
baño varchar(20) null,
precio money null,
estado int null
)
Y
HOSPEDAJE(
cod_hotel numeric(18) not null,
nro_habitacion numeric(18) null,
cod_partici numeric(18) null,
fecha_Ocupacion datetime null,
fecha_Salida datetime null,
diasOcupados int null
)
1
Carrera Informática Industrial TBD-500
Presentar el informe del laboratorio, con el siguiente formato: Indicar el enunciado del
ejercicio, escribir la función, ejecutar y capturar la pantalla del resultado de la ejecución de la
función (la captura de la imagen debe mostrar necesariamente el nombre de su base de datos
de usted.)
Trigger DML
Trigger DDL
Trigger DML.
Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento
de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT,
UPDATE o DELETE de una tabla o vista.
Son triggers que reaccionan ante eventos de inserción de datos en una tabla, actualización o
Borrado de datos. Por ejemplo, si borro el nombre de una persona de mi tabla de empleados,
el trigger podría lanzar un email.
Sintaxis
CREATE TRIGGER<Trigger_Name, sysname, Trigger_Name>
ON<Table_Name, sysname, Table_Name>
FOR | AFTER | INSTEAD OF
<Data_Modification_Statements, , INSERT,DELETE,UPDATE>
--PARA,DESPUES,EN VES DE
AS
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
-- relacionados con la sentencia SELECT
SET NOCOUNT ON;
-- Insertar instrucciones para trigger
END
Trigger DDL.
2
Carrera Informática Industrial TBD-500
Son triggers que se ejecutan al crear, borrar o modificar objetos. Por ejemplo si borro un
usuario o una tabla, podría iniciar un archivo .bat
Sintaxis
CREATE TRIGGER<trigger_name, sysname, table_alter_drop_safety>
ON
DATABASE
FOR<data_definition_statements, , DROP_TABLE, ALTER_TABLE>
AS
BEGIN
...
END
La tabla deleted (eliminada), almacena copias de las filas afectadas por las instrucciones
delete y update. Durante la ejecución de una instrucción delete o update, las filas se quitan de
la tabla de disparadores y se transfieren a la tabla deleted. La tabla deleted y la tabla de
disparadores no suelen tener filas en común.
La tabla inserted (insertada), almacena copias de las filas afectadas por las instrucciones
insert y update. Durante la ejecución de insert o update, se añaden filas nuevas a inserted y a
la tabla de disparadores al mismo tiempo. Las filas de inserted son copias de las nuevas filas
de la tabla de disparadores.
3
Carrera Informática Industrial TBD-500
Una actualización con update es, en realidad, una eliminación seguida de una inserción; primero las
filas antiguas se copian en la tabla deleted y luego las filas nuevas se copian en la tabla de
disparadores y en la tabla inserted.
ROLLBACK TRANSACTION
Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de
nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino
también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la
transacción de Insert, Delete o Update volverá toda hacia atrás.
ALTER TRIGGER
Permite modificar la definición del trigger, no permite cambiar su nombre, para cambiar el nombre de
un trigger 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 ]
Ejemplo. Modificamos el trigger mensaje
alter trigger mmensaje
on dbo.participantes
for insert,update,delete
as
print 'Usted, ha modificado la tabla participantes'
go
4
Carrera Informática Industrial TBD-500
Los triggers son objetos de la Base de Datos, se encuentran en la tabla sysobjects por nombre. La
columna type de sysobjects identifica los disparadores con la abreviatura TR.
La siguiente consulta busca los disparadores que existen en una base de datos.
use DBAjdrezRoberta
-- obtenemos información sobre los trigger creados
select * from sysobjects where type = 'TR'
Resultado de la consulta es:
sp_helptext
Permite mostrar el texto de la instrucción créate trigger.
5
Carrera Informática Industrial TBD-500
Ejemplos
Trigger de Inserción
Cuando se inserta una nueva fila de clave externa, es conveniente asegurarse de que la clave externa
coincide con una clave primaria. El trigger debe verificar si existen combinaciones entre la fila o filas
insertadas y las filas de la tabla de clave primaria y luego revertir las inserciones de claves externas
que no coincidan con una de las claves de la tabla de clave primaria.
Ejemplo 1.
Creamos un trigger para la tabla árbitros, cuando se inserta un árbitro el trigger se activa y modifica el
estado del departamento de nacimiento igual a Pando.
-- cuando se inserta un arbitro actualizamos el dpto de nacimiento
-- igual a PANDO.
create trigger ejemploInsert
on arbitros for insert
as
update participantes set dpto_nac = 'Pando'
from participantes, inserted
where participantes.cod_partici = inserted.cod_partici
go
6
Carrera Informática Industrial TBD-500
Una vez ejecutado el trigger funcionara del siguiente modo: Una vez que se inserte datos a la tabla
árbitros, se actualizará la tabla participantes definiendo del departamento de nacimiento igual a
Pando, siempre y cuando el código del participante sea igual al código del árbitro insertado.
Verificamos previamente los datos antes de activar el trigger
Select * from participantes
Where cod_partici =70
Vemos que en la tabla participantes el campo dpto_nac esta nulo cuando el cod_partici = 70
Activamos el trigger
7
Carrera Informática Industrial TBD-500
Trigger de Actualización
Dado que una clave primaria es el identificador único de su fila y de las filas externas de otras tablas,
un intento de actualizar una clave primaria debe realizarse con extremo cuidado. En este caso se debe
proteger la integridad de referencia revirtiendo la actualización a no ser que se cumplan las
condiciones especificadas.
Como norma general, es más adecuado prohibir cualquier cambio de edición de la clave primaria, por
ejemplo, revocando todos los permisos para esa columna, pero usando el trigger se puede prohibir las
actualizaciones en determinadas circunstancias.
a. Creación de trigger
Ejemplo.
/* Trigger que evita la modificacion de la clave primaria tabla participante
si se intenta cambiar el codigo del participante el dia
jueves,viernes, sabado o domingo se cancela la actualizacion
*/
create trigger ejemploUpdate
on participantes
for update
as
-- ¿Ha cambiado el cod_participante?
if update (cod_partici)
and datename(dw,getdate()) in ('Jueves','Viernes','Sabado','Domingo')
begin
-- rollback trans anula los cambios
8
Carrera Informática Industrial TBD-500
rollback transaction
print 'No esta permitido la modificacion'
print 'de la clave primaria los dias'
print datename(dw,getdate())
end
ROLLBACK TRANSACTION
Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de
nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino
9
Carrera Informática Industrial TBD-500
Ejemplo 2.
-- Para el siguiente trigger, creamos previamente la tabla temporal
CREATE TABLE tempo_campeon
( cod_campo NUMERIC(18,0) NOT NULL,
nomb VARCHAR(20) NULL,
fecha_i datetime NULL,
fecha_f datetime NULL,
cod_club numeric(18) NULL,
PRIMARY KEY cod_campo
)
--Creamos el trigger
CREATE TRIGGER modif_fechaini
ON campeonato
AFTER UPDATE
AS
-- ¿Se ha modificado la fecha inicio?
IF UPDATE(fecha_ini)
BEGIN
-- SET NOCOUNT ON impide que se generen mensajes de texto
SET NOCOUNT ON;
-- Actualizamos el campo fecha fin igual a la fecha actual
10
Carrera Informática Industrial TBD-500
Activamos el trigger
La salida es:
Trigger de eliminación
Cuando se elimina una fila de clave primaria, también deben eliminarse las filas de clave externa
correspondientes delas tablas dependientes. Esto mantiene la integridad de referencia, al garantizar la
eliminación delas filas discípulas cuando se quila la fila maestra. Si esto no se hiciera, podría acabar
con una base de datos que tuviera filas discípulas imposibles de recupera o identificar. Por tanto es
preciso tener un trigger que lleve a cabo una eliminación en cascada.
Ejemplo 1.
-- trigger de eliminación
/*Cuando se ejecuta una instruccion de eliminacion de una
fila en la tabla participantes, una o mas filas salen de la
tabla participante y se añaden a la tabla deleted.El trigger
comprueba las tablas dependientes, si tienen filas con un valor
cod_partici que coincida con los valores cod_partici quitados de
la tabla participantes y almacenados ahora en la tabla deleted,
11
Carrera Informática Industrial TBD-500
12
Carrera Informática Industrial TBD-500
Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos
(DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-
SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo
DDL.
BEGIN
...
END
La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de
datos.
CREATE TRIGGER TR_SEGURIDAD
ON DATABASE FOR DROP_TABLE, ALTER_TABLE
AS
BEGIN
RAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1)
ROLLBACK TRANSACTION
END
13
Carrera Informática Industrial TBD-500
Ejercicios
Antes de realizar los ejercicios debe modificar la estructura de la tabla Habitaciones, adicionando una
nueva columna llamando estados, que asumirá el valor de 1 = ocupado y 0= desocupado.
1. Crear un trigger de inserción para la tabla partidas, para cuando se inserte datos para esta
tabla, el trigger se activa y define la fecha de partida igual a la fecha de hoy.
2. Crear un trigger de inserción para la tabla hospedaje, para cuando se inserta un nuevo
registro, modificar el estado de la tabla habitaciones igual a 1 de aquel código de hotel
numero de habitación insertado.
3. Crear un trigger para la tabla habitaciones, para cuando se modifica el precio de cualquier
habitación anular la transacción y enviar un mensaje, activar el trigger cuando se modifica el
precio de la habitación.
4. Crear un trigger para la tabla hospedaje, para cuando se intenta modificar la fecha de salida,
anular la transacción, enviar los mensajes apropiados.
5. Crear un trigger para la tabla hotel_aloja_participantes, para cuando se modifica la fecha de
inicio, anular la transacción y actualizar la columna obs definiendo el siguiente texto “Se
intento modificar la fecha,,,,”+ la fecha actual.
6. Crear un trigger de eliminación para la tabla club, activar el trigger cuando se elimina un club,
si ocurre esto, asignar la columna cod_club de la tabla campeonato igual a null.
7. Crear un trigger de eliminación para la tabla hotel, para cuando se elimina una o mas filas
anular la transacción, y almacenar en un tabla denominada aux_sunombre con las filas que se
intento eliminar.
8. Crear un trigger de eliminación para la tabla movimientos, para cuando se elimina los
movimientos de una determinada partida, activar el trigger eliminando las movidas siempre y
cuando la fecha de partida corresponda a la fecha de hoy.
9. Crear un trigger de eliminación para la tabla árbitros, para cuando se elimina los árbitros que
proceden del país Brasil, insertar la filas a ser borradas en una tabla auxiliar denominada
aux_sunombre. Las filas a ser eliminadas se añaden a la tabla deleted, de esta tabla debe
insertar a la tabla aux_sunombre.
10. Crear un trigger de actualización para la tabla campeonato, para cuando se modifica la fecha
inicio o la fecha fin, insertar la filas a ser modificadas a una tabla auxiliar denominada
aux_suapellidopaterno. Las fila a ser modificda se añaden a la tabla inserted, de esta tabla
debe insertar a la tabla aux_suapellidopaterno.
14
Carrera Informática Industrial TBD-500
15