Você está na página 1de 15

Carrera Informática Industrial TBD-500

Laboratorio Nro. 4

TRIGGERS
EN SQLSERVER

Docente: Lic. Roberta Mallcu

Objetivo:

El presente laboratorio tiene por objeto comprender, aplicar, practicar y ejercitar Triggers en
SQLServer.

A. Instructivo

Para realizar el presente laboratorio, tome en cuenta las siguientes instrucciones:

 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.)

B. Repaso de los siguientes conceptos


TRIGGER
Un trigger o disparador ( o desencadenador) en Transact SQL es una clase especial de procedimiento
almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases
de datos; es decir, los triggers son objetos de la base de datos que ejecutan acciones cuando se
producen ciertos eventos de inserciones, modificaciones, borrados, creación de tablas, etc.

SQL Server proporciona los siguientes tipos de triggers:

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

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

2
Carrera Informática Industrial TBD-500

Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan


operaciones de tipo DDL.

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

Funcionamiento de los triggers(disparadores)


Los triggers de integridad de referencia mantienen los valores de las claves externas en línea con los
de las claves primarias. Cuando una modificación de datos afecta a una columna clave, los
disparadores comparan los nuevos valores de columna con las claves relacionadas usando tablas de
trabajo temporales llamadas tablas de verificación de disparadores. Cuando se escriben los
disparadores, las comparaciones se basan en los datos almacenados temporalmente en las tablas de
verificación de disparadores.
En las instrucciones de los disparadores se usan dos tablas especiales:

- La tabla deleted (eliminada)


- La tabla inserted (insertada)
Estas son tablas temporales usadas en la verificación de disparadores, estas tablas sirven para
comprobar los efectos de algunas modificaciones de datos y definir las condiciones de las acciones del
disparador.
No es posible alterar directamente los datos de las tablas de verificación de disparadores, pero se
pueden usar las tablas en instrucciones select para detectar los efectos de una instrucción insert,
update o delete.

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

El mensaje de error que aparece es:

“La transacción terminó en el desencadenador. Se anuló el lote.”

ACTIVAR Y DESACTIVAR TRIGGERS


A través de las siguientes instrucciones activamos y desactivamos trigger.

 DISABLE TRIGGER name_trigger ON name_tabla


Desactiva el trigger de una tabla
 ENABLE TRIGGER name_trigger ON name_tabla
Activa el trigger de una tabla
 ALTER TABLE name_tabla DISABLE TRIGGER ALL
Desactiva todos los trigger de una tabla
 ALTER TABLE name_tabla ENABLE TRIGGER ALL
Activa todos los trigger de una tabla

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

Obtención de información sobre los triggers

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:

Como se puede visualizar aparece el nombre del trigger.


sp_help
Obtiene un informe sobre un disparador. Ejemplo

sp_helptext
Permite mostrar el texto de la instrucción créate trigger.

5
Carrera Informática Industrial TBD-500

Ejemplos

1. Creamos un trigger para cuando se modifica el apellido paterno, anulamos la transacción


(actualización) si ocurre esto.

a. Creamos el trigger denominado cambio_paterno

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

Verificamos la inserción de los datos en la tabla árbitros

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

b. Probamos que el trigger se active


-- probamos el funcionamiento del trigger --
update participantes set cod_partici= 7777
where cod_partici= 2800

c.El resultado de la ejecución es.

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

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.

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
)

-- Borramos el Trigger si existise


IF OBJECT_ID ('modif_fechaini', 'TR') IS NOT NULL
BEGIN
DROP TRIGGER modif_fechaini;
END;
Go

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

UPDATE campeonato SET fecha_fin=GetDate()


WHERE cod_campo=(SELECT cod_campo FROM inserted);
-- A modo de verificacion, añadimos un registro en la tabla
tempo_campeon
INSERT INTO tempo_campeon(cod_campo,nomb,fecha_i,fecha_f,cod_club)
SELECT cod_campo,nombre,fecha_ini,fecha_fin,cod_club FROM DELETED
WHERE cod_campo = DELETED.cod_campo
END

Verificamos los datos antes de activar el trigger

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

entonces el disparador, la quita.


*/
create trigger ejemploDelete
on ciudades
for delete
as
-- elimina las filas de la tabla ciudad_envia_particique coincidan
-- con la tabla ciudad
delete ciudad_envia_partici
from ciudad_envia_partici, deleted
where ciudad_envia_partici.cod_ciudad = deleted.cod_ciudad
go

Activamos que el trigger se ejecute

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.

La sintaxis general de un trigger DDL es la siguiente.


CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety>
ON DATABASE
FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE>
AS

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.

Se pide escribir los siguientes trigger :

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.

FECHA DE PRESENTACION PROXIMA CLASE

14
Carrera Informática Industrial TBD-500

15

Você também pode gostar