100% encontró este documento útil (1 voto)
142 vistas13 páginas

Implementación de Desencadenadores en SQL

Este documento presenta una guía de laboratorio sobre la implementación de procedimientos almacenados y desencadenadores en una base de datos. Explica los objetivos de validar información con procedimientos almacenados y activar mensajes de advertencia con desencadenadores. Describe los tipos de desencadenadores, su sintaxis de creación, y las tablas INSERTED y DELETED que contienen datos antiguos y nuevos. También presenta ejemplos de creación de una base de datos de control de exámenes con tablas de alumnos, exámenes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
142 vistas13 páginas

Implementación de Desencadenadores en SQL

Este documento presenta una guía de laboratorio sobre la implementación de procedimientos almacenados y desencadenadores en una base de datos. Explica los objetivos de validar información con procedimientos almacenados y activar mensajes de advertencia con desencadenadores. Describe los tipos de desencadenadores, su sintaxis de creación, y las tablas INSERTED y DELETED que contienen datos antiguos y nuevos. También presenta ejemplos de creación de una base de datos de control de exámenes con tablas de alumnos, exámenes
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

UNIVERSIDAD DON BOSCO

FACULTAD DE INGENIERÍA
ESCUELA DE COMPUTACION
GUIA DE LABORATORIO Nº10
Nombre de la práctica: Implementación de Procedimientos almacenados y
CICLO 02-2019 desencadenadores
Lugar de ejecución: Laboratorio de Informática
Materia: Modelamiento y Diseño de Base de datos

I. Objetivos

Qué el estudiante sea capaz de:

1. Validar la información que se utilizará en la Base de datos por medio de procedimientos


almacenados.

2. Utilizar desencadenadores para activar mensajes de advertencia

3. Implementar los diferentes tipos de desencadenadores

II. Introducción Teórica

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

La sintaxis de la sentencia de creación de TRIGGERS es la siguiente:

CREATE TRIGGER nombre


ON tabla
FOR [DELETE | INSERT | UPDATE]
AS
Sentencias

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:

CREATE TRIGGER modificacion_Clientes

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

UPDATE Customers SET ContactName='Maria Walters'


WHERE CustomerID='AROUT'

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

Las tablas DELETED e INSERTED

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:

Crearemos una tabla de ejemplo:

CREATE TABLE tablaPruebas


(
codigo INT,
nombre VARCHAR(30),
fecha DATE
)

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.

CREATE TRIGGER TriggertablaPruebas ON tablaPruebas

2
AFTER INSERT, UPDATE, DELETE
AS
SELECT * FROM deleted;
SELECT * FROM inserted;

Agregamos algunos datos:

INSERT INTO tablaPruebas


VALUES( 1, 'María Morales' ,'2016-05-14'),
( 2, 'Luis Alberto Pérez','2016-05-29')

Como podemos observar solo hay datos en la tabla INSERTED.

SELECT * FROM deleted

SELECT * FROM inserted

Vamos a eliminar un dato de la tabla

DELETE FROM tablaPruebas


WHERE codigo=2

Y ahora podemos observar solo hay datos en la tabla DELETED

SELECT * FROM deleted

SELECT * FROM inserted

Ahora modificaremos una fila:

UPDATE tablaPruebas
SET nombre = 'Marcia Morales'
WHERE codigo = 1

3
El resultado es:

SELECT * FROM deleted

SELECT * FROM inserted

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.

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

• Un TRIGGER sólo se puede aplicar a una tabla

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

• En una vista no se puede utilizar un desencadenador.

III. Requerimientos

Nº Cantidad Descripción
1 1 Guía de Laboratorio #10 de MBD
2 1 Maquina con SQL Server 2012 o versiones superiores

IV. Procedimiento

1. En un nuevo Script, crear cada ejercicio, debe colocar como nombre:


Guia10_EjercicioProcedimiento_SuCarnet.sql

Ejercicio 1

2. Crear la base de datos, copiar el siguiente código:

--Crear la base de datos


CREATE DATABASE Control_Examen_SuCarnet
GO

--Hacer uso de la base de datos


USE Control_Examen_SuCarnet
GO

3. Crear las siguientes tablas, puede copiar el siguiente código:

CREATE TABLE Alumnos


(
Carnet VARCHAR(10) NOT NULL PRIMARY KEY,
Nombre VARCHAR(30) NOT NULL,
Apellido1 VARCHAR(30) NOT NULL,
Apellido2 VARCHAR(30) NOT NULL,
Sexo VARCHAR(2) NOT NULL,
)
GO

CREATE TABLE Examenes


(
cod_examen INT NOT NULL PRIMARY KEY,
titulo VARCHAR(100) NOT NULL,
n_preguntas INT NOT NULL,
)
GO

5
CREATE TABLE Notas
(
cod_examen INT NOT NULL FOREIGN KEY REFERENCES
Examenes(cod_examen),
Carnet VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES
Alumnos(Carnet),
nota_examen DECIMAL(4,2) NOT NULL,
fecha SMALLDATETIME NOT NULL,
)
GO

CREATE TABLE Respuestas


(
cod_examen INT NOT NULL FOREIGN KEY REFERENCES
Examenes(cod_examen),
Carnet VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES
Alumnos(Carnet),
n_pregunta INT NOT NULL,
opcion_respuesta INT NOT NULL,
)
GO

CREATE TABLE Preguntas


(
cod_examen INT NOT NULL FOREIGN KEY REFERENCES
Examenes(cod_examen),
n_pregunta INT NOT NULL,
texto_pregunta VARCHAR(100) NOT NULL,
n_opciones INT NOT NULL,
opcion_correcta INT NOT NULL
)
GO

CREATE TABLE Opciones


(
cod_examen INT NOT NULL FOREIGN KEY REFERENCES
Examenes(cod_examen),
n_pregunta INT NOT NULL,
n_opcion INT NOT NULL,
texto_opcion VARCHAR(50) NULL
)
GO

4. Crear el diagrama de la base de datos

6
5. Insertando Datos a partir de Procedimientos Almacenados

6. Para insertar datos en la tabla Alumnos, crear un procedimiento llamado Insert_Alumno, tal como
se muestra a continuación:

7. Utilizar el procedimiento almacenado creado anteriormente para insertar los siguientes datos:

Realizar un SELECT a la tabla para ver los registros agregados.

Ejercicio 2

8. Se insertarán datos en las tablas Examenes, Preguntas y Opciones en base al siguiente formato de
examen:

Código del Examen: 1


Título: “Conceptos de Procedimientos Almacenados”
No. de Preguntas: 2

7
1. Con que sentencia se crea un procedimiento almacenado:
1. CREATE PROCEDURE
2. CREATE PROC
3. Ambas
(# de opcion correcta: 3)
2. Con que comando se ejecuta un procedimiento almacenado:
1. EXECUTE
2. sp_executesql
(# de opcion correcta: 1)

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

12. Agregando registros a la tabla Opciones por medio de la instrucción INSERT

Realizar un SELECT a cada tabla para ver los registros agregados.

Ejercicio 3

Mensajes de Error definidos por el usuario

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

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

13. Crear el siguiente mensaje:

--Creando los mensajes o verificar si ya existe el mensaje

Si todo está bien deberá mostrar la siguiente salida:

Si al ejecutar la consulta anterior le aparece el siguiente mensaje de error:

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. Hacer uso de nuevo de la base de datos Control_examen_SuCarnet y creamos un procedimiento


almacenado el cual va a realizar la operación de calcular la nota del alumno después de haber
contestado el examen

Ejercicio 4

15. Verifique que se encuentre en su base de datos de la practica

16. Antes de crear el procedimiento almacenado, se verifica la existencia de este en la base de datos, si
el procedimiento existe se elimina y sino no se realiza ninguna acción

17. Crear el siguiente procedimiento almacenado

9
--Creacion del procedimiento
CREATE PROC Calculo_de_Nota
@carnetx VARCHAR(10), @codexamen INT
AS
BEGIN
DECLARE @totcorrecta INT, --contador para respuestas correctas
@porcentaje FLOAT, --porcentaje de cada pregunta
@npreguntas INT, --numero de preguntas del examen
@correctaresp INT, --captura la opcion correcta del examen(opc_correcta)
@respuesta INT, --captura la opcion que selecciono el alumno
(opcion_respuesta)
@perfect FLOAT, --constante = 10
@NOTA FLOAT--nota del examen

--Verifica la cantidad de preguntas que tiene el examen


SELECT @npreguntas= CONVERT(FLOAT,COUNT(n_pregunta))FROM Preguntas
WHERE cod_examen=@codexamen
SELECT @perfect = 10.00 --Asignar un dato a una variable
SELECT @porcentaje= @perfect/@npreguntas --calculo de porcentaje para c/pregunta
SELECT @totcorrecta=0 --se inicializa un contador de respuestas correctas a 0

WHILE(@npreguntas > 0)
BEGIN
--Asignar la opcion correcta del examen
SELECT @correctaresp = opcion_correcta FROM Preguntas
WHERE (cod_examen = @codexamen and n_pregunta = @npreguntas)
--Asignar la respuesta del alumno del examen
SELECT @respuesta = opcion_respuesta FROM Respuestas
WHERE (cod_examen = @codexamen and Carnet = @carnetx and
n_pregunta = @npreguntas)

--Compara la opcion correcta del examen con la respuesta del alumno


IF(@correctaresp = @respuesta)
BEGIN
--Si coinciden los datos se incrementa un contador, el cual controla
--el total de respuestas correctas por parte del alumno
SELECT @totcorrecta = @totcorrecta + 1
END -- fin de IF
SELECT @npreguntas=@npreguntas-1 --se decrementa el total de preguntas
END --fin de WHILE

--Calcula la nota del examen


SELECT @NOTA = @totcorrecta * @porcentaje
--Agrega la nota a la tabla Notas
INSERT INTO Notas VALUES (@codexamen,@carnetx,@NOTA,GETDATE())
END -- fin del cuerpo del procedimiento

--Para ver la nota en la ventana de resultados


SELECT "NOTA_EXAMEN"=CONVERT(FLOAT,@NOTA)
GO

Ejercicio 5

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

19. Verificar la existencia del TRIGGER, ejecutar la siguiente consulta:

10
20. Digitar el siguiente código:

21. Realice las siguientes pruebas, ejecutar la siguiente consulta:

22. Ejecutar la siguiente consulta

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

Como puede observar al dar clic en la


pestaña Resultados se puede ver la nota
que obtuvo el alumno al resolver el examen

11
Y al hacer clic en la pestaña Mensajes, se puede observar el mensaje creado, y los resultados tanto
del procedimiento almacenado como del desencadenador

23. Ejecutar las siguientes consultas

24. Guardar los cambios al archivo.

V. Análisis de resultados

Utilizando la siguiente base de datos realizar lo siguiente.

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

VI. Referencia Bibliográfica

Microsoft SQL Server 2008, Guía Práctica, Francisco Charte Ojeda; Anaya Multimedia.

13

También podría gustarte