Guía 10 BD
Guía 10 BD
Guía 10 BD
FACULTAD DE INGENIERÍA
ESCUELA DE COMPUTACION
GUIA DE LABORATORIO Nº10
Nombre de la práctica: Implementación de Procedimientos almacenados y
desencadenadores
CICLO 01-2020
Lugar de ejecución: Laboratorio de Informática
Tiempo estimado: 2 horas y 30 minutos
Materia: Base de datos
I. Objetivos
Desencadenadores (TRIGGERS)
Los disparadores de procedimiento, más comúnmente conocidos como TRIGGERS, son una especie de
procedimientos almacenados, a diferencia que se ejecutan cuando ocurre un evento sobre alguna tabla.
Entendemos por evento, cualquier acción del tipo:
• Inserción
• Borrado
• Actualización
Las palabras reservadas DELETE, INSERT y UPDATE corresponden a cada una de las acciones para las cuales
se puede definir un desencadenador dentro de la tabla especificada.
El bloque de sentencias permite prácticamente cualquier tipo de ellas dentro del lenguaje T-SQL, pero con
ciertas limitaciones. Por ejemplo, no se podrá utilizar la sentencia SELECT, ya que un TRIGGER no puede
devolver datos al usuario, sino que simplemente se ejecuta para cambiar o comprobar los datos que se van
a insertar, actualizar o borrar.
Por ejemplo, si queremos crear un TRIGGER llamado modificacion_Clientes, sobre la tabla Customers, que
muestre un mensaje cada vez que se actualiza una fila de la tabla, deberemos escribir el Código:
1
CREATE TRIGGER modificacion_Clientes
ON Customers FOR UPDATE AS
PRINT 'Han actualizado la tabla de Customers'
Para comprobar el funcionamiento de este TRIGGER, podemos actualizar cualquier fila de la tabla de
Customers, por ejemplo con la sentencia:
Con esto conseguimos dos cosas, actualizar el nombre del Cliente cuyo código es AROUT y obtener el
mensaje que se muestra como ejecución del TRIGGER de actualización.
Sin embargo, los TRIGGERS en SQL Server tienen una serie de limitaciones:
1. No se puede disparar un TRIGGER dentro de otro TRIGGER, ya que daría lugar a un bucle infinito
2. Por esta razón, un TRIGGER no puede ejecutar instrucciones DDL (lenguaje de definición de
datos)
3. No se pueden ejecutar sentencias como SELECT INTO o de creación de dispositivos dentro de un
TRIGGER
Del mismo modo, para borrar un TRIGGER, deberemos ejecutar la sentencia DROP TRIGGER TRIGGER.
Por ejemplo, si queremos borrar el TRIGGER anteriormente creado, ejecutaremos
DROP TRIGGER modificacion_Clientes
Dentro de la definición de un TRIGGER, podemos hacer referencia a un par de tablas lógicas, cuya estructura
es similar a la tabla donde se está ejecutando el TRIGGER; es decir, es una copia de la tabla en la cual se van
a insertar o borrar los datos, y que contiene, precisamente, los datos que van a ser añadidos o borrados.
La utilidad de estas dos tablas es la de realizar comprobaciones entre los datos antiguos y los nuevos.
Así, por ejemplo, si queremos recuperar los datos de la tabla que estamos borrando, dentro del TRIGGER, se
deberá ejecutar el siguiente código:
SELECT *
FROM deleted
Ejemplo:
Después crearemos un TRIGGER en el cual podemos especificar las tablas virtuales INSERTED y DELETED,
donde indicaremos que se dispare después de un INSERT, UPDATE o DELETE y que haga una consulta a las
tablas lógicas antes mencionadas para ver su contenido.
2
CREATE TRIGGER TriggertablaPruebas ON tablaPruebas
AFTER INSERT, UPDATE, DELETE
AS
SELECT * FROM deleted;
SELECT * FROM inserted;
UPDATE tablaPruebas
SET nombre = 'Marcia Morales'
WHERE codigo = 1
3
El resultado es:
Tipos de desencadenadores
SQL-Server permite la definición de varios tipos de TRIGGERS, entre los cuales cabe destacar los siguientes:
• Desencadenadores múltiples: para una misma tabla, se pueden definir distintos TRIGGERS para la
misma acción, es decir, si definimos un TRIGGER para insert, y resulta que dicha tabla ya tenía
definido un TRIGGER para esa misma acción, se ejecutarán ambos TRIGGERS cuando ocurra dicho
evento sobre la tabla.
• Desencadenadores recursivos: se permite la recursividad entre las llamadas a los TRIGGERS, es decir,
un TRIGGER puede llamar a su vez a otro, bien de forma directa, bien de forma indirecta.
• Desencadenadores anidados: si un TRIGGER cambia una tabla en la que se encuentra definido otro
TRIGGER, se provoca la llamada de este último que, si a su vez vuelve a modificar otra tabla, puede
provocar la ejecución de otro TRIGGER, y así sucesivamente. Si se supera el nivel de anidamiento
permitido, se cancelará la ejecución de los TRIGGERS.
Aunque ya se han comentado algunas de las limitaciones a la hora de programar TRIGGERS, veamos en
detalle las restricciones que implica la definición de TRIGGERS:
• Aunque un TRIGGER se defina dentro una sola base de datos, puede hacer referencia a objetos que
se encuentran fuera de la misma
• La misma acción del desencadenador puede utilizarse para definir más de un TRIGGER sobre la misma
tabla.
4
• La opción SET elegida dentro de la ejecución de un desencadenador, volverá a su estado previamente
definido una vez concluya la ejecución del mismo.
• Así mismo, no se permite la utilización de las sentencias del DDL dentro de la definición de un
TRIGGER.
III. Requerimientos
Nº Cantidad Descripción
1 1 Guía de Laboratorio #10 de BD
2 1 Maquina con SQL Server 2012
IV. Procedimiento
2. Hacer clic en la opción Todos los programas y hacer clic en Microsoft SQL Server 2012
Para conectarse con el servidor de base de datos elija los siguientes parámetros de autenticación:
3. Luego seleccionara del menú estándar la opción (Nueva Consulta/New Query) para empezar a
trabajar con las sentencia de T-SQL.
4. Localice el icono de guardar, con el fin de guardar el nuevo archivo de sentencias T-SQL
(Guia11_Procedimiento_SuCarnet.sql).
2. En los ejercicios de este punto cambiar en todos los ejercicios la palabra SuCarnet por su número de
carnet
5
4. Ejecutamos el procedimiento almacenado
6. Antes de ejecutar el procedimiento se debe verificar la información de la tabla Products, por ejemplo
al ejecutar la consulta:
6
7. Se obtienen los siguientes resultados (estos pueden variar, tomar en cuenta los resultados obtenidos
en la consulta)
9. Ahora verifique los resultados, ejecutando la consulta del punto 5, si no hay cambios en los datos,
modifique el procedimiento almacenado por la siguiente información:
11. En el siguiente ejemplo se desea mostrar los nombres de los clientes que se encuentran en la tabla
Customers
7
Nota:
Cuando trabajemos con cursores debemos seguir los siguientes pasos:
Cuando trabajamos con cursores, la función @@FETCH_STATUS nos indica el estado de la última instrucción
FETCH emitida, los valores posibles son:
Valor
Descripción
devuelto
0 La instrucción FETCH se ejecutó correctamente.
-1 La instrucción FETCH no se ejecutó correctamente o la fila estaba más allá del
conjunto de resultados.
-2 Falta la fila recuperada.
8
Nota:
ROLLBACK TRANSATION: Revierte una transacción explícita o implícita hasta el inicio de la transacción o hasta
un punto de retorno dentro de la transacción.
2. Crear la siguiente tabla:
4. Verifique los resultados, debe de mostrar el mensaje indicando de que no se puede eliminar ni
modificar una tabla en la base de datos, el disparador se activa en el momento que un usuario desee:
eliminar o modificar una tabla. Por eso es que no se puede eliminar la tabla prueba_SuCarnet
Cada vez que se agregue un dato a la tabla se mostrara el mensaje indicando que se ha agregado un
nuevo dato a la tabla
7. Agregar un nuevo dato a la tabla Employees (el dato a ingresar son su apellido y nombre)
9
9. Antes de verificar el TRIGGER, realice la consulta para conocer el código del empleado (EmployeeID)
que se agregó en el punto 7
10. Comprobar el TRIGGER realizando una actualización en el apellido del empleado donde el código del
empleado sea igual al que obtuvo en la consulta anterior
La tabla DELETED 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 eliminan de la tabla del
desencadenador (TRIGGER) y se transfieren a la tabla DELETED.
15. Ejecutar la siguiente consulta para eliminar más de un registro de la tabla Employees
V. Ejercicio complementario
11
Carnet VARCHAR(10) NOT NULL FOREIGN KEY
REFERENCES Alumno(Carnet),
n_pregunta INT NOT NULL,
opcion_respuesta INT NOT NULL,
)
GO
6. Para insertar datos en la tabla Alumno, crear un procedimiento llamado Insert_Alumno, tal como se
muestra a continuación:
12
7. Utilizar el procedimiento almacenado creado anteriormente para insertar los siguientes datos:
8. Se insertaran datos en las tablas Examenes, Preguntas y Opciones en base al siguiente formato de
examen:
9. Crear el siguiente procedimiento almacenado para llenar los datos en la tabla Examenes:
10. Agregar los siguientes registros a la tabla Examenes por medio del procedimiento almacenado
11. Por medio de instrucción INSERT agregar los siguientes registros a la tabla Preguntas
13
12. Agregando registros a la tabla Opciones por medio de la instrucción INSERT
Antes de insertar datos en la tabla de Respuestas, se creará un TRIGGER que despliegue un mensaje de
advertencia cuando el alumno este contestando la última pregunta del examen (en este caso sería la
pregunta 2).
Para ello crear primero un mensaje definido por el usuario, este mensaje es añadido a la tabla
sysmessages (sysmessages se encuentra en la base de datos master) utilizando el procedimiento
almacenado del sistema sp_addmessage.
Para crear el mensaje debe especificarse el número del mensaje, el tipo o nivel de severidad y el texto
del mensaje. (Los mensajes de error deben tener un número arriba de 50000, pues los otros números
son reservados por SQL Server).
Significa que el número del mensaje 50001 ya existe en la base de datos master, así que cambie el
número por uno consecutivo (por ejemplo 50002)
14
16. Crear el siguiente procedimiento almacenado
15
17. Crear el siguiente TRIGGER el cual se activa después de cada inserción que se realiza en la tabla
respuesta verifica que pregunta a contestado el alumno de un examen especifico y se llama al
procedimiento Calculo_de_Nota para calcular la nota del examen
16
Al contestar esta última pregunta se activa el TRIGGER y cuando el alumno contesta la última
pregunta se ejecuta el procedimiento almacenado para calcular la nota del examen
17
Agregar los siguientes registros:
Ejercicios:
1. Crear un desencadenador que se active cada vez que se inserte un registro en la tabla pedidos y otro
para la tabla producto.
2. Crear un desencadenador para la tabla producto, que se active cada vez que se inserte un
registro o se actualice la columna precio, la condición para aceptar al inserción o la actualización
es que el precio costo no debe ser mayor que el precio venta.
3. Crear un desencadenador para la tabla pedidos que cada vez que se realice un pedido
descuente la existencia de la tabla productos, en caso que la cantidad del pedido supere a la
existencia debe deshacer la transacción y mostrar un mensaje de error.
Microsoft SQL Server 2008, Guía Práctica, Francisco Charte Ojeda; Anaya Multimedia.
18