Laboratorio de Bases de DatosLaboratorio de Bases de Datos
Unidad V
Departamento de Electricidad, Electrónica y ComputaciónFacultad de Ciencias Exactas y Tecnología
Universidad Nacional de Tucumán
Primer Semestre 2018
2Lab. Bases de Datos (EBB) | Unidad V - 2018
Introducción [1 | 4]
Procedimientos almacenadosDefiniciónCreaciónRecomendacionesModificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
3Lab. Bases de Datos (EBB) | Unidad V - 2018
Introducción [2 | 4]
ParametrizaciónParámetros de entradaParámetros de salidaMensajes de errorManejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
4Lab. Bases de Datos (EBB) | Unidad V - 2018
Introducción [3 | 4]
TriggersDefiniciónAdministraciónAnidamiento y recursividadEjemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
5Lab. Bases de Datos (EBB) | Unidad V - 2018
Introducción [4 | 4]
Triggers DDLDefiniciónCreaciónAdministración
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
6Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [1 | 23]
Procedimiento Almacenado (Stored Procedure):Colección de sentencias SQL, con un nombre, almacenadas en el servidor dentro de la BD
Finalidad: Encapsular tareas repetitivas
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
7Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [2 | 23]
Características:Soportan declaración de variables, ejecución condicional y otras características de programación
Aceptan parámetros de entrada y devuelven valores
Devuelven un valor de estado que indica éxito o falla
Pueden llamar a otros procedimientos almacenados
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
8Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [3 | 23]
Tipos:Del sistemaLocalesTemporalesRemotosExtendidos
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
9Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [4 | 23]
Procedimientos almacenados del sistema:Devuelven información de objetos del sistema y ejecutan tareas de mantenimiento
MySQL no tiene estos tipos de procedimientos
En SQL Server se almacenan en la BD master y sus nombres comienzan con sp_:
sp_help
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
10Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [5 | 23]
Procedimientos almacenados locales:Creados en las BD de usuario
Procedimientos almacenados temporales:En SQL Server sus nombres empiezan con # o ## (si son locales o globales)
No son soportados por MySQL
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Los procedimientos almacenados temporales se crean siempre en la BD tempdb.
11Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [6 | 23]
Procedimientos almacenados remotos:Soportan la funcionalidad de consultas y operaciones distribuidas
Procedimientos almacenados extendidos: Se ejecutan fuera del ambiente del servidorNo son soportados por MySQLEn SQL Server, sus nombres comienzan con xp_
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Los procedimientos almacenados extendidos son funciones dentro de una DLL que incrementan la funcionalidad de SQL Server.
●Ejemplo:
EXEC master..xp_cmdshell 'dir c:\'
12Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [7 | 23]
Características:Encapsulan la lógica de negocio y crean una lógica de la aplicación reusable
Ocultan a los usuarios la complejidad subyacente y detalles internos de la BD
Proveen mecanismos de seguridad
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Las reglas o políticas de negocio encapsuladas en los procedimientos se pueden modificar en un único lugar. Todos los clientes pueden usar los mismos procedimientos almacenados asegurándose un acceso consistente a los datos.
●Si todas las funciones de negocio se soportan mediante un conjunto de procedimientos almacenados, los usuarios no deben acceder a las tablas/vistas directamente.
●Se puede asignar permisos a los usuarios para ejecutar los procedimientos almacenados, aún cuando no tengan permisos para acceder a las tablas o vistas a que hacen referencia los mismos.
13Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [8 | 23]
Características (continuación):Reducen el tráfico en la red
Reducen la vulnerabilidad debido a los ataques de SQL injection
Se pueden usar para mantener la integridad de datos y reforzar políticas de la BD
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En vez de enviar varias de sentencias SQL por la red, se envía una única sentencia (el llamado al procedimiento) y se recibe su respuesta.
●Mediante el uso de parámetros en el código SQL se reduce la posibilidad que se puedan embeber sentencias SQL en los valores de los parámetros.
14Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [9 | 23]
Características (continuación):Si se modifican no se necesita hacer un despliegue
Facilitan los cambios en entornos variados
Resulta difícil depurarlos (debugging)
Resulta difícil su refactoreo (renombrado o cambio de ubicación)
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En entornos variados (web, escritorio, herramientas de reportes distribuidas en diferentes sistemas operativos, etc), hacer ciertos cambios en las reglas de negocio resulta más facil con procedimientos almacenados.
15Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [10 | 23]
Características (continuación):Hacerles pruebas unitarias requiere de código externo a la BD
Resulta difícil hacerles control de versiones
No mejoran el rendimiento (ver plan de ejecución)
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Control de versiones: ¿cuán fácil resulta volver a la versión 1 (de hace un año) desde la versión 2 (la actual)?. Una posible solución consiste en versionar los nombres de los procedimientos, quedando la base de datos con una mezcla de procedimientos viejos y nuevos.
16Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [11 | 23]
Plan de ejecución: Es el resultado del cálculo realizado por el optimizador de consultas para determinar el modo más eficiente de implementar una consulta
2 planes: Real: muestra cómo se ejecutó una consulta
Estimado: muestra cómo se ejecutaría una consulta
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Para una determinada consulta, se puede ver el plan de ejecución real que se ejecutó, o la forma en que el SGBDR ejecutará la consulta (plan estimado).
●Estos planes pueden diferir ya que por ejemplo, las estadísticas pueden estar desactualizadas (ver más adelante).
17Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [12 | 23]
Procesos que se realizan cuando se ejecuta una consulta:
Análisis sintáctico (parsing)
Normalización
Compilación
Optimización
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Cuando se ejecuta una consulta, el servidor realiza una serie de procesos con la finalidad de brindar la información solicitada, o guardarla, de la forma más rápida posible, conservando la integridad de datos.
18Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [13 | 23]
Análisis sintáctico (parsing): Controla que la consulta esté bien escrita (bien formada)
No se controlan los nombres de los objetos o columnas
La salida de este proceso se llama “árbol de consulta”
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
19Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [14 | 23]
Normalización: Verifica los nombres de objetos y columnas, los tipos de datos, la presencia de funciones de agrupamiento, el uso de alias o sinónimos que se deban resolver, etc
La salida de este proceso es la entrada del proceso de compilación
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
20Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [15 | 23]
Compilación: Construye planes de ejecución teniendo en cuenta la salida del proceso anterior
La salida de este proceso es la entrada del proceso de optimización
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
21Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [16 | 23]
Optimización: Evalúa los distintos planes de ejecución y elige el de menor costo (el plan que considere que ejecutará la consulta más rápidamente usando la menor cantidad de recursos)
Para la elección del plan tiene en cuenta las estadísticas, los operadores en la cláusula WHERE, el uso de JOIN, UNION, GROUP BY y ORDER BY
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Las estadísticas se obtienen de columnas e índices dentro de la BD, y describen la distribución de los datos y el grado de unicidad de los mismos. Por defecto, las estadísticas se crean y actualizan automáticamente para todos los índices y para cualquier columna que aparezca en un WHERE o JOIN.
●Si las sentencias fueran DDL (Data Definition Language), no habría una forma mejor que otra para crear una tabla por ejemplo, por lo que habría un único plan de ejecución.
22Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [17 | 23]
Optimización: Para determinar el mejor plan, el optimizador utiliza las estadísticas y recorre los distintos planes, prueba distintos tipos de JOINs, modifica el orden de los JOINs, prueba distintos índices, etc
A cada paso de un plan le asigna un número, que representa el tiempo estimado para ejecutarlo. La suma de estos tiempos es el tiempo estimado (costo) de un plan
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●A veces el optimizador selecciona un plan no muy eficiente si considera que le tomará más tiempo evaluar muchos planes.
●Si se tiene una consulta simple, por ejemplo una única tabla sin índices ni funciones de agrupamiento, en lugar de consumir tiempo intentando calcular el plan más óptimo, el optimizador puede utilizar un plan simple
23Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [18 | 23]
Optimización: Una vez elegido el plan de ejecución, el mismo se guarda en el cache de procedimientos
Con el plan de ejecución elegido y guardado en el cache de procedimientos, se ejecuta la consulta (según el plan)
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
24Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [19 | 23]
Primera ejecución de un procedimiento: Se arma su plan de ejecución y se lo guarda en el cache de procedimientos
Siguientes ejecuciones: Reutilizan el plan de ejecución que ya está en memoria (evitan tener que volver a crearlo)
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●El cache de procedimientos es un área de memoria que guarda temporalmente los planes de ejecución compilados. Está formado por una serie de páginas que contienen los planes de ejecución y cuyo tamaño fluctúa dinámicamente de acuerdo a los niveles de actividad.
25Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [20 | 23]
Permanencia de un plan de ejecución en memoria:Depende del tiempo requerido para su recompilación (costo).
Depende de su frecuencia de uso (edad)
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
26Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [21 | 23]
Los procedimientos almacenados no optimizan las consultas:
En algunos motores, como SQL Server 2000 y 7.0, un procedimiento almacenado se compila durante su ejecución como cualquier otra sentencia T-SQL
SQL Server 2000 y 7.0 mantienen los planes de ejecución para todas las sentencias SQL en el cache, no solo para los procedimientos almacenados
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Más información:● https://stackoverflow.com/questions/226859/disad
vantage-of-stored-procedures● http://www.spoiledtechie.com/post/Whats-up-
with-Stored-Procedures-these-days.aspx● https://www.seguetech.com/advantages-and-
drawbacks-of-using-stored-procedures-for-processing-data/
● https://stackoverflow.com/questions/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code
27Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [22 | 23]
En SQL Server, para ver los planes de ejecución, además de la interfaz gráfica, se puede usar:
SET SHOWPLAN_XML ON: plan de ejecución estimado en formato XMLSET SHOWPLAN_TEXT ON: plan de ejecución estimado en formato textoSET STATISTICS XML ON: plan de ejecución real en formato XMLSET STATISTICS PROFILE ON: plan de ejecución real en formato texto
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
28Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [23 | 23]
En MySQL, para ver los planes de ejecución, además de la interfaz gráfica, se puede usar:
EXPLAIN + Consulta: plan de ejecución real
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
29Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [1 | 8]
Consideraciones:Se emplea la sentencia CREATE PROCEDURE
Pueden referenciar tablas, vistas, otros procedimientos y tablas temporales
En SQL Server la sentencia CREATE PROCEDURE debe ser la única sentencia en el batch, por lo que no se puede combinar con otra sentencia T-SQL
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL server, también se puede crear un procedimiento desde SSMS. En MySQL también se lo puede hacer desde algún entorno gráfico (Workbench por ejemplo).
●Si un procedimiento crea una tabla temporal local, ésta deja de existir cuando termina la ejecución del procedimiento.
30Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [2 | 8]
SQL Server:
CREATE PROCEDURE asp_listado
AS
SELECT P.IdPersona, Apellidos, Nombres, Domicilio, Email, Tipo, Numero
FROM Personas P JOIN Telefonos T ON P.IdPersona = T.IdPersona
ORDER BY 2, 3GO
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaSQLServer.sql
●En el caso de SQL server, se puede emplear la sentencia CREATE PROCEDURE o su forma abreviada CREATE PROC.
●Los nombres de los procedimientos se guardan en la tabla de sistema sysobjects y los códigos en la tabla syscomments.
31Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [3 | 8]
MySQL:DELIMITER //
CREATE PROCEDURE `asp_listado`()
BEGIN SELECT P.IDPersona, Apellidos, Nombres,
Domicilio, Email, Tipo, Numero
FROM Personas P INNER JOIN Telefonos T
ON (P.IDPersona = T.IDPersona) ORDER BY 2, 3;
END //DELIMITER ;
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaMySQL.sql
●En el caso de MySQL la primer sentencia DELIMITER cambia el delimitador por defecto (;) a // ya que se quiere pasar el procedimiento almacenado al servidor como un todo, en lugar de dejar que la herramienta interprete cada sentencia por vez. El segundo DELIMITER restituye el delimitador por defecto.
32Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [4 | 8]
Ejecución en SQL Server: se emplea la sentencia EXECUTE seguida del nombre del procedimiento y sus parámetros:
EXECUTE dbo.asp_listado
Ejecución en MySQL: se emplea la sentencia CALL seguida del nombre del procedimiento y sus parámetros:
CALL asp_listado();
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En SQL Server se puede usar la forma abreviada de EXECUTE: EXEC.
●En MySQL si el procedimiento no lleva parámetros, también se lo puede llamar sin los mismos.
33Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [5 | 8]
En SQL Server también se pueden ejecutar los procedimientos como parte de una sentencia INSERT, la cual puede poblar una tabla con el resultado devuelto por un procedimiento:
INSERT INTO <tabla> EXEC <procedimiento>
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Para que funcione el ejemplo, la tabla debe existir y los tipos de datos y columnas deben coincidir con lo devuelto por el procedimiento.
34Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [6 | 8]
Los procedimientos pueden anidarse (un procedimiento llama a otro):
El nivel de anidamiento es limitado
Si Proc1 llama a Proc2, Proc2 puede acceder a todos los objetos definidos localmente en Proc1
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En SQL Server puede haber hasta 32 niveles de anidamiento, y la variable @@nestlevel guarda el nivel de anidamiento actual.
35Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [7 | 8]
En SQL Server:Para ver información sobre los procedimientos:
sp_help, sp_helptext y sp_depends
Para obtener una lista de procedimientos:
sp_stored_procedures
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
36Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [8 | 8]
En MySQL:Para ver información sobre un procedimiento:
SHOW CREATE PROCEDURE nombre;
Para obtener una lista de procedimientos:
SHOW PROCEDURE STATUS;
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
37Lab. Bases de Datos (EBB) | Unidad V - 2018
Recomendaciones [1 | 2]
Cualificar los nombres de los objetos dentro del cuerpo del procedimiento
En SQL Server, tratar de evitar romper la cadena de permisos
Realizar un procedimiento por cada tarea (cohesión)
Crear, probar y corregir los procedimientos en el servidor, luego hacer la prueba en los clientes
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Para evitar romper la cadena de permisos, se recomienda que el usuario dbo sea el dueño de los procedimientos (similar a las vistas).
38Lab. Bases de Datos (EBB) | Unidad V - 2018
Recomendaciones [2 | 2]
En SQL Server, evitar el uso del prefijo sp_ para los procedimientos
Usar las mismas configuraciones de conexión para todos los procedimientos
Minimizar el uso de procedimientos temporales
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●SQL Server guarda las configuraciones de las opciones SET QUOTED_IDENTIFIER (cuando está activa, los nombres de objetos se pueden delimitar por comillas dobles, por lo que se puede usar un nombre reservado del lenguaje, y cuando está inactiva éstos deben seguir las reglas de T-SQL) y SET ANSI_NULLS (especifica el comportamiento del operador = y <> cuando se compara contra NULL) cuando se crea o modifica un procedimiento. Estas configuraciones se utilizan cuando se ejecuta el procedimiento. Por lo tanto, las configuraciones de cada conexión para estas opciones se ignoran durante la ejecución del SP.
●Minimizar el uso de procedimientos temporales con el fin de evitar contienda en las tablas de sistema de la BD tempdb.
39Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [1 | 6]
En SQL Server, para modificar un procedimiento se puede usar la sentencia ALTER PROC[EDURE]
En MySQL, la sentencia ALTER PROCEDURE sólo permite modificar algunas características de un procedimiento, no su cuerpo ni parámetros
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server, también se puede modificar un procedimiento desde SSMS, mientras que en MySQL desde alguna herramienta gráfica (Workbench por ejemplo).
●Como en MySQL no se puede modificar el cuerpo o parámetros de un procedimiento mediante la sentencia ALTER PROCEDURE, se deberá borrar y volver a crear el mismo. Para esto resulta de utilidad el comando SHOW CREATE PROCEDURE, el cual muestra la definición del procedimiento, junto con sus parámetros.
40Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [2 | 6]
Ejemplo SQL Server:
ALTER PROCEDURE asp_listado
AS SELECT P.IdPersona, Apellidos, Nombres,
Domicilio, Email, Tipo, Numero
FROM Personas P JOIN Telefonos T
ON P.IdPersona = T.IdPersona ORDER BY 3, 2
GO
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
41Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [3 | 6]
Consideraciones (SQL Server):Incluir las opciones que correspondan para la modificación, como WITH ENCRYPTION, WITH RECOMPILE, etc
Sólo se modifica un procedimiento (el externo)
Se necesita tener determinados permisos
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Si Proc1 llama a Proc2, y se modifica Proc1, el cambio es en Proc1 (Proc2 no se ve afectado).
●Cuando se modifica un procedimiento, se mantienen los permisos del mismo.
42Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [4 | 6]
A veces es necesario recompilar el plan de ejecución:Se agregan/borran/modifican índicesSe cambian los datos en columnas indexadas
Esta recompilación se produce automáticamente:Cuando SQL Server ejecuta la consulta por primera vezSe cambian las tablas subyacentes
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Esta opción no está disponible en MySQL.
43Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [5 | 6]
Formas de recompilar explícitamente un plan de ejecución:
Especificar WITH RECOMPILE en la sentencia CREATE PROCEDURE
Especificar WITH RECOMPILE en la sentencia EXECUTE
Usar el procedimiento de sistema sp_recompile
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Al especificar WITH RECOMPILE en la sentencia CREATE PROCEDURE, el plan de ejecución no se guarda en el cache, y se recompila cada vez que se ejecuta.
●Al especificar WITH RECOMPILE en la sentencia EXECUTE, se crea un nuevo plan durante la ejecución del procedimiento y se guarda en el cache.
●El procedimiento almacenado de sistema sp_recompile recompila el procedimiento que se le especifica la próxima vez que se ejecute. Se le puede especificar una tabla o vista, con lo cual se recompilan los planes de ejecución de todos los procedimientos asociados.
44Lab. Bases de Datos (EBB) | Unidad V - 2018
Modificación y borrado [6 | 6]
Borrado de un procedimiento (SQL Server):
DROP PROC[EDURE] dbo.asp_listado
Borrado de un procedimiento (MySQL):
DROP PROCEDURE asp_listado;
Definición
Creación
Recomendaciones
Modificación y borrado
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server, también se puede borrar un procedimiento desde SSMS, mientras que en MySQL desde alguna herramienta gráfica (Workbench por ejemplo).
●En SQL Server se puede emplear el procedimiento sp_depends para ver si otros objetos dependen del que se quiere borrar.
45Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [1 | 11]
Parámetros de entrada:Permiten pasar información a los procedimientos
Se los debe declarar en la sentencia CREATE PROCEDURE
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
46Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [2 | 11]
Consideraciones:Verificar al principio del procedimiento los valores de entrada para detectar posibles valores inválidos
Proveer valores por defecto apropiados (SQL Server)
El máximo número de parámetros depende del SGBDR
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server 2008, un procedimiento soporta hasta 2100 parámetros de entrada.
●MySQL no soporta que se especifique un valor por defecto en la definición de un parámetro. Una alternativa consiste en verificar en el cuerpo del procedimiento si el parámetro es null, y en cuyo caso asignarle un valor por defecto. Para esto también se puede emplear la función IFNULL().
47Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [3 | 11]
Consideraciones:El máximo número de variables locales es limitado solamente por la memoria disponible (depende del SGBDR)
Los parámetros tienen un ámbito local al procedimiento
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
48Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [4 | 11]
SQL Server:@parámetro tipo_dato [ = valor_defecto]
CREATE PROCEDURE asp_buscar_personas
@cad varchar (100)AS SELECT *
FROM Personas WHERE Apellidos LIKE @cad + '%'
ORDER BY ApellidosGO
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaSQLServer.sql
49Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [5 | 11]
MySQL:parámetro tipo_dato
DELIMITER //CREATE PROCEDURE `asp_buscar_personas`(cad varchar (100))
BEGINSELECT * FROM Personas
WHERE Apellidos LIKE CONCAT(cad ,'%')ORDER BY Apellidos;
END //DELIMITER ;
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaMySQL.sql
50Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [6 | 11]
Llamada a un procedimiento con parámetros de entrada:SQL Server
Por referenciaPor posición
MySQLPor posición
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server, no se puede mezclar ambas formas durante el llamado del procedimiento.
51Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [7 | 11]
Llamada por referencia:En la sentencia EXEC se especifica el parámetro de la forma @parámetro = valor
El orden de los parámetros puede ser cualquiera
Se pueden omitir parámetros
Se puede especificar @parámetro = DEFAULT
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Si se omiten parámetros, se adoptan los valores por defecto o el valor nulo.
52Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [8 | 11]
Llamada por referencia:
EXEC asp_buscar_personas @cad = 'Villa'
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
53Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [9 | 11]
Llamada por posición (SQL Server):Se pasan los valores en el mismo orden en que fueron definidos el procedimiento
Se pueden omitir parámetros en valores por defecto, pero no se debe interrumpir la secuencia
Se usan también valores nulos y DEFAULT como parámetros
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
54Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [10 | 11]
Llamada por posición (SQL Server):
EXEC asp_buscar_personas 'Villa'
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
55Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de entrada [11 | 11]
Llamada por posición (MySQL):Se pasan los valores en el mismo orden en el que fueron definidos en el procedimiento
Se usan también valores nulos como parámetros
CALL asp_buscar_personas('Villa');
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
56Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de salida [1 | 5]
Un procedimiento puede devolver información a quien lo llama en forma de parámetros de salida
SQL Server usa OUTPUT al definir el procedimiento: CREATE PROCEDURE asp_total_personas @cantidad int output
AS SET @cantidad=(SELECT COALESCE(COUNT(IdPersona), 0)
FROM Personas)
GO
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaSQLServer.sql
57Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de salida [2 | 5]
En MySQL, los parámetros pueden ser de 3 tipos:IN (por defecto): quien llame al procedimiento debe proporcionar el parámetro. El procedimiento trabaja con una copia de este parámetro
OUT: el valor del parámetro se puede cambiar en el procedimiento. El procedimiento no puede acceder al valor inicial de este parámetro cuando empieza
INOUT: combinación de las 2 opciones anteriores
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
58Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de salida [3 | 5]
Ejemplo en MySQL: DELIMITER // CREATE PROCEDURE `asp_total_personas`
(OUT cantidad integer)
BEGIN
SET cantidad = (SELECT COALESCE(COUNT(IDPersona), 0) FROM Personas);
END //
DELIMITER ;
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaMySQL.sql
59Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de salida [4 | 5]
Llamada a un procedimiento con parámetros de salida:SQL Server
Se emplea la cláusula OUTPUT
Quien llama al procedimiento debe tener una variable para guardar el valor de salida
DECLARE @resultado intEXEC asp_total_personas @resultado OUTPUTSELECT 'El resultado es: ' , @resultado
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Quien llama al procedimiento debe tener una variable para guardar el valor de salida, que puede ser de cualquier tipo de datos, salvo text o image.
●Si se omite OUTPUT al llamar al procedimiento, el mismo se ejecuta igual, pero no devuelve el valor que corresponda.
60Lab. Bases de Datos (EBB) | Unidad V - 2018
Parámetros de salida [5 | 5]
Llamada a un procedimiento con parámetros de salida:MySQL
DECLARE @resultado integerCALL asp_total_personas(@resultado);SELECT @resultado;
Parámetros de entrada
Parámetros de salida
Valores de retorno
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
61Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [1 | 11]
Mensajes de error:Permiten a los procedimientos comunicar el estado de la transacción al usuario
En SQL Server, para implementar los mensajes de error:Sentencia RETURNProcedimiento sp_addmessageFunción @@errorSentencia RAISERROR
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
62Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [2 | 11]
Sentencia RETURN:Permite devolver información de un procedimiento
Es más limitado que el uso de parámetros de salida ya que devuelve un único valor entero
Generalmente se la utiliza para devolver un valor de estado o código de error
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
●La sentencia RETURN sale de una consulta o procedimiento incondicionalmente.
63Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [3 | 11]
Ejemplo RETURN:
ALTER PROC unProc @name varchar(30),
@IDDept smallint OUTPUTAS
IF (@name = '')
RETURN -1
... SET @IDDept = SCOPE_IDENTITY()
RETURN 0GO
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
En el ejemplo se puede ver que si no se pasa un nombre se devuelve -1 (para indicar una condición de falla), y en caso contrario un 0 (para indicar una condición de éxito).
●SQL Server devuelve un 0 automáticamente si no se especifica un valor de retorno.
64Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [4 | 11]
Ejemplo RETURN (continuación):
DECLARE @dept int, @resultado int
EXEC @resultado = unProc '', @dept OUTPUTIF (@resultado = 0)
SELECT @dept
ELSE
SELECT 'Error'
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
65Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [5 | 11]
Procedimiento sp_addmessage:Crea mensajes de error definidos por el usuario
Todos los mensajes de error (de usuario y sistema) se almacenan en la tabla sysmessages
Se pueden escribir en el Visor de Eventos de Windows
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
66Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [6 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Ejemplo sp_addmessage:
EXEC sp_addmessage
@msgnum = 50011, @severity = 10,
@msgtext = ‘El registro no puede ser borrado’,
@with_log = ‘TRUE’
●@msgnum: número entero que identifica al mensaje. Para los mensajes creados por el usuario, debe estar entre 50001 y 2147483647.
●@severity: número entero que indica el nivel de gravedad del mensaje. Debe estar entre 1 y 25.
●@with_log: si vale True, el mismo se regitra en el Visor de Eventos de Windows, y si vale False no.
67Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [7 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Función @@error:Contiene el número de error de la sentencia T-SQL más reciente
Se borra y resetea con cada sentencia que se ejecuta
Devuelve 0 cuando la sentencia se ejecuta satisfactoriamente
68Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [8 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Ejemplo @@error:..IF @error <> 0BEGIN ROLLBACK TRAN RETURNENDCOMMIT TRAN
69Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [9 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Sentencia RAISERROR:Genera un mensaje de error definido por el usuario y avisa al sistema que ha ocurrido un error
Puede escribir mensajes de error en el registro de errores de SQL o en el Visor de Eventos de Windows
70Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [10 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Ejemplo RAISERROR:EXEC sp_addmessage 50010, 10, 'Mensaje1'EXEC sp_addmessage 50011, 10, 'Mensaje2'
CREATE PROCEDURE dbo.unProcedimiento @member_no int
AS
IF @member_no IS NULL
BEGIN RAISERROR (50010, 10, 1)
RETURN END
●El primer parámetro de RAISERROR identifica al mensaje creado mediante el procedimiento sp_addmessage. Si no se especifica este identificador, RAISERROR genera un mensaje cuyo identificador es 50000.
●El segundo parámetro es el nivel de gravedad asociado con el mensaje (se puede sobrescribir al nivel de gravedad especificado con sp_addmessage). Los niveles entre 0 y 18 los puede especificar cualquier usuario, mientras que los niveles entre 19 y 25 sólo miembros del rol sysadmin, o usuarios con el permiso ALTER TRACE (también se exige la opción WITH LOG).
●El tercer parámetro especifica el estado (entre 0 y 255). No es usado.
71Lab. Bases de Datos (EBB) | Unidad V - 2018
Mensajes de error [11 | 11]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
MySQL cuenta con la sentencia LEAVE:DELIMITER //
CREATE PROCEDURE borrarOrden(ido integer)SALIR:BEGIN
DECLARE mensaje VARCHAR(100);
IF (ido IS NULL) THEN SELECT 'Mensaje1';
LEAVE SALIR;
END IF;
END //DELIMITER ;
72Lab. Bases de Datos (EBB) | Unidad V - 2018
Manejo de errores [1 | 4]
SQL Server permite gestionar el tratamiento de excepciones en cualquier situación transaccional, como ser un procedimiento almacenado
Bloque TRY/CATCHTRY: contiene las transacciones protegidas
CATCH: gestiona los errores
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Esta característica está disponible a partir de la versión 2005 de SQL Server.
●El bloque TRY contiene el código transaccional con probabilidades de fallar, mientras que el bloque CATCH contiene el código a ejecutar en caso de producirse un error en el bloque TRY.
●MySQL no soporta esta característica.
73Lab. Bases de Datos (EBB) | Unidad V - 2018
Manejo de errores [2 | 4]
Ejemplo TRY/CATCH: CREATE PROCEDURE asp_modificar_telefono ...
BEGIN TRY
UPDATE Telefonos SET Tipo = @tipo, Numero = @num WHERE IdPersona = @idp AND IdTelefono = @idt
SET @mensaje = 'Teléfono modificado'
END TRY
BEGIN CATCH SET @mensaje = 'Error al guardar el teléfono'
END CATCH
GO
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Proyecto AgendaMySQLSQLServer: script AgendaSQLServer.sql
74Lab. Bases de Datos (EBB) | Unidad V - 2018
Manejo de errores [3 | 4]
Recomendaciones:Crear un bloque CATCH inmediatamente después de un bloque TRY
Hacer un ROLL BACK de las transacciones con problemas dentro del bloque CATCH
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●No se puede incluir ninguna sentencia entre las sentencias END TRY y BEGIN CATCH.
●El uso de transacciones permite agrupar múltiples sentencias para que todas se completen de manera exitosa, o ninguna.
75Lab. Bases de Datos (EBB) | Unidad V - 2018
Manejo de errores [4 | 4]
Recomendaciones (continuación):Si es necesario, capturar la información del error
ERROR_LINEERROR_MESSAGEERROR_NUMBERERROR_PROCEDUREERROR_SEVERITYERROR_STATE
Parámetros de entrada
Parámetros de salida
Mensajes de error
Manejo de errores
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●SQL Server cuenta con un conjunto de funciones para el manejo de errores, las cuales se pueden llamar en el bloque CATCH:
●ERROR_LINE: devuelve la línea donde se produjo el error.
●ERROR_MESSAGE: devuelve el mensaje de error.●ERROR_NUMBER: devuelve un número que identifica el error.
●ERROR_PROCEDURE: devuelve el nombre del procedimiento o trigger donde se produjo el error.
●ERROR_SEVERITY: devuelve un valor indicando la gravedad del error.
●ERROR_STATE: algunos mensajes de error se pueden generar en distintos lugares. Cada condición que genera un mensaje asigna un estado único. Esta función devuelve el estado.
76Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [1 | 5]
Trigger:Tipo de procedimiento almacenado que se ejecuta automáticamente al modificarse los datos de la tabla sobre la que se lo creó
Cualquier sentencia SQL que se admita en un procedimiento se puede incluir dentro de un trigger
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Cuando ocurre una inserción, modificación o borrado de datos en una tabla, y se definió un trigger para la misma y para esa acción, se ejecuta automáticamente, no pudiéndose detener.
77Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [2 | 5]
Características:Se usan para mantener la integridad de datos
No devuelven valores
Su principal ventaja es que manejan complejidad de procesamiento
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Aunque un trigger puede devolver valores, no tiene sentido (las aplicaciones no lo esperan).
78Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [3 | 5]
Características (continuación):Son reactivos mientras que las restricciones (constraints) son proactivas
Se disparan después de la ejecución de sentencias INSERT, UPDATE o DELETE
Una tabla puede tener múltiples triggers del mismo tipo, sin orden de ejecución
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Los triggers son reactivos mientras que las restricciones son proactivas: quiere decir que las restricciones se verifican primero (se verifican antes de la sentencia y del trigger): si se violan las restricciones, el trigger nunca se dispara.
79Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [4 | 5]
Características (continuación):Los dueños de tablas deben tener permisos para crear, modificar y borrar triggers
No se puede crear triggers en vistas ni en tablas temporales, pero sí las pueden referenciar
No admiten parámetros
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
80Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [5 | 5]
Usos:Cambios en cascada de tablas relacionadas
Forzado de integridad de datos de manera compleja
Definición de mensajes de error de usuario
Comparación de estados antes y después
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Cambios en cascada de tablas relacionadas: un trigger para borrado en la tabla “Compras” puede borrar todas las filas de la tabla “LineasCompras” (esto se puede ejecutar más eficientemente empleando integridad referencial en cascada).
●Forzado de integridad de datos de manera compleja: los triggers pueden proteger contra inserciones, borrados y modificaciones incorrectas, e imponer restricciones más complejas que las definidas mediante constraints de tipo CHECK.
●Definición de mensajes de error de usuario: los triggers pueden mostrar mensajes de error definidos por el usuario.
●Comparación de estados antes y después: los triggers pueden comparar el estado de una modificación de datos antes y después de dicha modificación y luego ejecutar determinadas acciones según esta diferencia.
81Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [1 | 25]
Tipos de triggers en SQL Server:AFTER:
Se ejecutan después que se produce la acciónSólo se pueden definir en tablasSe pueden definir varios en una misma tabla
INSTEAD OF: Se ejecutan en lugar de la acción usual del triggerSe pueden definir también en vistas (1 por tabla o vista)
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Los triggers del tipo INSTEAD OF están disponibles a partir de la versión 2005 de SQL Server.
●En versiones previas a la 2005, a los triggers AFTER se los conocía como triggers FOR.
82Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [2 | 25]
Si una tabla tiene definidas restricciones, triggers AFTER e INSTEAD OF:
Las restricciones se verifican después de la ejecución del trigger INSTEAD OF, pero antes de la de los triggers AFTER
Si se violan las restricciones, las acciones del trigger INSTEAD OF se vuelven atrás y los triggers AFTER nunca se ejecutan
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Los triggers reactivos con respecto a las restricciones son los AFTER. Los triggers INSTEAD OF son proactivos.
83Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [3 | 25]
En MySQL, al definir un trigger se puede especificar el momento en el que se disparará:
AFTER: el trigger se dispara después de modificar la fila
BEFORE: el trigger se dispara antes de modificar la fila
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
84Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [4 | 25]
Los triggers se crean con la sentencia CREATE TRIGGER:
Nombre del trigger
Tabla a la cual pertenece el trigger
Evento por el que se dispara el trigger
Cuerpo del procedimiento
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server, también se lo puede hacer desde SSMS, mientras que en MySQL desde alguna herramienta gráfica (Workbench por ejemplo).
●Para crear un trigger, se debe especificar su nombre, la tabla a la cual pertenece, el evento por el que se dispara y el cuerpo del procedimiento.
85Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [5 | 25]
Consideraciones:Para crear un trigger se requieren determinados permisos
Claúsula IF UPDATE (SQL Server)
Cadena de permisos (SQL Server)
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●En el caso de SQL Server, para crear un trigger se debe ser miembro de los roles db_owner o sysadmin.
●En SQL Server se puede emplear la cláusula IF UPDATE (columna) para focalizar la acción a una determinada columna, y no a todas las columnas de una tabla.
●Es recomendable que dbo sea dueño de los objetos subyacentes para no romper la cadena de permisos.
86Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [6 | 25]
Consideraciones (continuación):Pueden aceptar cualquier sentencia SQL, salvo:
Todas las sentencias CREATE y DROPALTER (TABLE, DATABASE, PROCEDURE, VIEW y TRIGGER)GRANT, REVOKE y DENYUPDATE STATISTICSRECONFIGURE
LOAD DATABASE y RESTORE DATABASE
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
87Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [7 | 25]
Trigger para inserción:Se dispara al agregar filas a la tabla en la que está creadoCuando se dispara agrega filas a una tabla llamada inserted (SQL Server) o NEW (MySQL)La tabla inserted o NEW mantiene una copia de las filas que se agregaronSe pueden referenciar las filas de la tabla inserted o NEW desde el trigger
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●La tabla inserted o NEW es una tabla lógica, es decir, sólo se la puede referenciar desde el cuerpo del trigger cuando se ejecuta el mismo.
●Las filas de la tabla inserted o NEW siempre son un duplicado de una o más filas de la tabla del trigger.
●El trigger puede examinar la tabla inserted o NEW para determinar las acciones a ejecutar.
●La tabla NEW es insensible a mayúsculas.
88Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [8 | 25]
Ejemplo de trigger para inserción:Se tiene la tabla Prestamos con un trigger para inserción:
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
143
143
121
121
100110041002
100110041002
100110021003
100110021003
02/13/9102/14/9102/14/91
02/13/9102/14/9102/14/91
02/27/9102/28/9102/28/91
02/27/9102/28/9102/28/91
89Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [9 | 25]
Ejemplo de trigger para inserción:Se hace una inserción en la tabla Prestamos:
INSERT INTO Prestamos VALUES (603, 4, 11, 123, GETDATE(), (GETDATE() + 30))
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
loanloanloanloan
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
143
143
121
121
100110041002
100110041002
100110021003
100110021003
02/13/9102/14/9102/14/91
02/13/9102/14/9102/14/91
02/27/9102/28/9102/28/91
02/27/9102/28/9102/28/91
loanloanloanloan
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
1443
1443
1121
1121
1001100410041002
1001100410041002
1001100110021003
1001100110021003
02/13/9102/13/9102/14/9102/14/91
02/13/9102/13/9102/14/9102/14/91
02/27/9102/27/9102/28/9102/28/91
02/27/9102/27/9102/28/9102/28/91
4 1 1004 1001 02/13/91 02/27/91
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
1443
1443
1121
1121
1001100410041002
1001100410041002
1001100110021003
1001100110021003
02/13/9102/13/9102/14/9102/14/91
02/13/9102/13/9102/14/9102/14/91
02/27/9102/27/9102/28/9102/28/91
02/27/9102/27/9102/28/9102/28/91
603 4 11 123 02/15/91 03/17/91
90Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [10 | 25]
Ejemplo de trigger para inserción:Se dispara el trigger registrando la inserción en la tabla inserted o NEW:
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
loanloanloanloan
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
143
143
121
121
100110041002
100110041002
100110021003
100110021003
02/13/9102/14/9102/14/91
02/13/9102/14/9102/14/91
02/27/9102/28/9102/28/91
02/27/9102/28/9102/28/91
loanloanloanloan
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
1443
1443
1121
1121
1001100410041002
1001100410041002
1001100110021003
1001100110021003
02/13/9102/13/9102/14/9102/14/91
02/13/9102/13/9102/14/9102/14/91
02/27/9102/27/9102/28/9102/28/91
02/27/9102/27/9102/28/9102/28/91
4 1 1004 1001 02/13/91 02/27/91
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
1443
1443
1121
1121
1001100410041002
1001100410041002
1001100110021003
1001100110021003
02/13/9102/13/9102/14/9102/14/91
02/13/9102/13/9102/14/9102/14/91
02/27/9102/27/9102/28/9102/28/91
02/27/9102/27/9102/28/9102/28/91
603 4 11 123 02/15/91 03/17/91
inserted / NEWinserted / NEWinserted / NEWinserted / NEW
603603 44 1111 123123 02/15/9102/15/91 03/17/9103/17/91
91Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [11 | 25]
Ejemplo de trigger para inserción:Se ejecuta el cuerpo del trigger:
CREATE TRIGGER prestamos_insert
ON PrestamosAFTER INSERT
AS
UPDATE c SET on_loan = 'Y'
FROM Copias c INNER JOIN inserted I
ON c.isbn = i.sbn AND c.copy_no = i.copy_no
GO
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
CopiasCopiasCopiasCopias
isbnisbn copy_nocopy_no title_notitle_no on_loanon_loan
1443
1443
1121
1121
1001100410041002
1001100410041002
YYNN
YYNN
603 4 11 Y
●En este ejemplo, se puede ver que cuando se inserta una fila en la tabla Prestamos, y en la misma hay definido un trigger para inserción, se actualiza la tabla Copias indicando que la copia del libro que se prestó está en ese estado (prestado).
●Para crear triggers del tipo AFTER se puede emplear esta cláusula, o la cláusula FOR (esta era la única que se podía especificar en versiones previas a la del 2005).
●Para crear triggers del tipo INSTEAD OF se reemplaza AFTER por estas palabras.
92Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [12 | 25]
Trigger para inserción en MySQL:
DELIMITER //
CREATE TRIGGER Telefonos_Insert AFTER INSERT ON Telefonos
FOR EACH ROW
BEGIN -- cuerpo del trigger
END//
DELIMITER ;
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●Si se especifica la opción FOR EACH ROW, el trigger se ejecuta una vez para cada fila, y si no se especifica esta opción, el trigger se ejecuta una única vez sin importar el número de filas.
93Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [13 | 25]
Trigger para borrado:Se dispara al borrar filas de la tabla en la que está creadoCuando se dispara agrega filas a una tabla llamada deleted (SQL Server) u OLD (MySQL)La tabla deleted u OLD mantiene una copia de las filas que se borraronSe pueden referenciar las filas de la tabla deleted u OLD desde el trigger
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
●La tabla deleted u OLD es una tabla lógica, es decir, sólo se la puede referenciar desde el cuerpo del trigger cuando se ejecuta el mismo.
●La tabla borrada y la tabla deleted u OLD no tienen filas en común.
●El trigger puede examinar la tabla deleted u OLD para determinar las acciones a ejecutar.
●En el caso de SQL Server, el trigger de borrado no se dispara con la sentencia TRUNCATE TABLE.
●La tabla OLD es insensible a mayúsculas.
94Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [14 | 25]
Ejemplo de trigger para borrado:Se tiene la tabla Prestamos con un trigger para borrado:
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
143
143
121
121
100110041002
100110041002
100110021003
100110021003
02/13/9102/14/9102/14/91
02/13/9102/14/9102/14/91
02/27/9102/28/9102/28/91
02/27/9102/28/9102/28/91
95Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [15 | 25]
Ejemplo de trigger para borrado:Se borra una fila de la tabla Prestamos:
DELETE PrestamosWHERE isbn = 4 AND copy_no = 1
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
1443
1443
1121
1121
1001100410041002
1001100410041002
1001100110021003
1001100110021003
02/13/9102/13/9102/14/9102/14/91
02/13/9102/13/9102/14/9102/14/91
02/27/9102/27/9102/28/9102/28/91
02/27/9102/27/9102/28/9102/28/91
4 1 1004 1001 02/13/91 02/27/91
96Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [16 | 25]
Ejemplo de trigger para borrado:Se dispara el trigger registrando la inserción en la tabla deleted u OLD:
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no outdateoutdate duedateduedate
143
143
121
121
100110041002
100110041002
100110021003
100110021003
02/13/9102/14/9102/14/91
02/13/9102/14/9102/14/91
02/27/9102/28/9102/28/91
02/27/9102/28/9102/28/91
deleted / OLDdeleted / OLDdeleted / OLDdeleted / OLD
44 11 10041004 10011001 02/13/9102/13/91 02/27/9102/27/91
97Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [17 | 25]
Ejemplo de trigger para borrado:Se ejecuta el cuerpo del trigger:
CREATE TRIGGER prestamos_delete
ON PrestamosAFTER DELETE
AS
UPDATE c SET on_loan = 'N'
FROM Copias c INNER JOIN deleted d
ON c.isbn = d.isbn AND c.copy_no = d.copy.no
GO
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
CopiasCopiasCopiasCopias
isbnisbn copy_nocopy_no title_notitle_no on_loanon_loan
1443
1443
1121
1121
1001100410041002
1001100410041002
YYNN
YYNN
4 1 1004 N
●En este ejemplo, se puede ver que cuando se borra una fila de la tabla Prestamos, y en la misma hay definido un trigger para borrado, se actualiza la tabla Copias indicando que la copia del libro que se prestó ya no está en estado de prestado, sino devuelto.
98Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [18 | 25]
Trigger para modificación:Se dispara al modificar filas en la tabla en la que está creadoCuando se dispara las filas originales se mueven a la tabla deleted u OLD, y las filas modificadas se insertan a la tabla inserted o NEWSe pueden referenciar las filas de estas tablas desde el trigger
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
99Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [19 | 25]
Ejemplo de trigger para modificación:Se modifica una fila de la tabla Miembros, la cual tiene un trigger para modificación:
UPDATE MiembrosSET member_no = 10021
WHERE member_no = 1234
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
MiembrosMiembrosMiembrosMiembros
member_nomember_no lastnamelastname firstnamefirstname middleinitialmiddleinitial photographphotograph
10020100211002210023
10020100211002210023
AndersonBarrBarrAnderson
AndersonBarrBarrAnderson
AndrewAndrewBillBill
AndrewAndrewBillBill
ARNULLB
ARNULLB
~~~~~~~~~
~~~~~~~~~
1234 Barr Andrew R ~~~
100Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [20 | 25]
Ejemplo de trigger para modificación:Se registra la modificación como 2 pasos:
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
deleted / OLDdeleted / OLDdeleted / OLDdeleted / OLD
12341234 BarrBarr AndrewAndrew RR ~~~~~~
inserted / NEWinserted / NEWinserted / NEWinserted / NEW
1002110021 BarrBarr AndrewAndrew RR ~~~~~~
101Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [21 | 25]
Ejemplo de trigger para modificación:Se ejecuta el cuerpo del trigger:
CREATE TRIGGER member_update ON Miembros
AFTER UPDATE
AS IF UPDATE (member_no)
BEGIN
RAISERROR ('Error', 10, 1) ROLLBACK TRANSACTION
...
Definición
Administración
Anidamiento y recursividad
Ejemplos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
MiembrosMiembrosMiembrosMiembros
member_nomember_no lastnamelastname firstnamefirstname middleinitialmiddleinitial photographphotograph
10020100211002210023
10020100211002210023
AndersonBarrBarrAnderson
AndersonBarrBarrAnderson
AndrewAndrewBillBill
AndrewAndrewBillBill
ARNULLB
ARNULLB
~~~~~~~~~
~~~~~~~~~
1234 Barr Andrew R ~~~
●En este ejemplo, se puede ver que cuando se modifica una fila de la tabla Miembros, y en la misma hay definido un trigger para modificación, la operación se retrotrae si lo que se quiere modificar es la columna member_no.
●Un trigger, junto con la sentencia que lo dispara, son tratados como una sola transacción (no hace falta iniciar explícitamente la transacción). Esta transacción se puede volver atrás dentro del cuerpo del trigger (por esta razón, hay un ROLLBACK TRANSACTION sin un BEGIN TRANSACTION.
102Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [22 | 25]
Modificación de un trigger (SQL Server):Sentencia ALTER TRIGGER
ALTER TRIGGER prestamos_insert
ON Prestamos AFTER INSERTAS UPDATE c
SET on_loan = 'y'
FROM Copias c INNER JOIN inserted i ON c.isbn = i.isbn AND c.copy_no = i.copy_no
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
●Igual que en caso de los procedimientos almacenados, MySQL no soporta la modificación de triggers.
103Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [23 | 25]
Borrado de un trigger:Sentencia DROP TRIGGER
DROP TRIGGER prestamos_insert
Cuando se borra una tabla, se borran todos sus triggers
Sólo el dueño de una tabla tiene permiso para borrar un trigger de la misma
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
104Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [24 | 25]
Información sobre triggers:SQL Server:
Triggers de una tabla: sp_depends tablaDefinición del trigger: sp_helptext trigger
MySQLInformación sobre triggers:
SELECT * FROM information_schema.triggers
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
105Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [25 | 25]
Consideraciones de rendimiento:Los triggers se ejecutan rápidamente porque las tablas inserted (o NEW) y deleted (u OLD) están en el cache
El tiempo de ejecución está determinado por:Número de tablas referenciadasNúmero de filas afectadas
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
106Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [1 | 7]
Anidamiento:Un trigger puede contener sentencias INSERT, UPDATE y DELETE que afecten a otras tablas y, por ende, disparen otros triggers
En SQL Server, se puede habilitar o deshabilitar la opción de anidamiento (por defecto está habilitada)
MySQL no soporta el anidamiento de triggers
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
107Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [2 | 7]
Consideraciones:Los disparos sucesivos de triggers pueden ocurrir hasta en 32 niveles (cuando un trigger supera este nivel, termina y deshace la transacción)
Un trigger no se dispara 2 veces en un llamado (autollamada)
Como el trigger es una sola transacción, cualquier error en cualquier nivel retrotrae toda la transacción
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
●En SQL Server se puede ver el nivel de anidamiento con la función @@NESTLEVEL.
●Que un trigger no se dispare 2 veces en un llamado significa que no se dispara a sí mismo como respuesta a una segunda modificación en la misma tabla. Sin embargo, si un trigger T1 modifica una tabla, y esta modificación dispara un trigger T2, el cual modifica la tabla original, el trigger T1 se disparará recursivamente. Para evitar esto, se debe deshabilitar la opción de anidamiento.
108Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [3 | 7]
Razones para desactivar el anidamiento:Requiere un diseño planeado y una complejidad apreciableLas modificaciones de las tablas no siguen el orden esperado
Para desactivar el anidamiento:sp_configure 'nested triggers', 0
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
●Cuando se deshabilita la opción de anidamiento, si un trigger modifica una tabla, esta modificación no dispara el trigger asociado.
109Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [4 | 7]
Recursividad:Un trigger puede tener sentencias UPDATE, INSERT o DELETE que afecten a la misma tabla u otra
La activación de recursividad hace que el trigger pueda activarse él mismo hasta una condición de parada
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
110Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [5 | 7]
Tipos de recursividad:Recursividad directa: una modificación en la tabla T1 dispara el trigger Trig1, que modifica la tabla T1 y se dispara nuevamente
Recursividad indirecta: una modificación en la tabla T1 dispara el trigger Trig1, que modifica la tabla T2, disparándose el trigger Trig2 de T2, que modifica la tabla T1, disparándose Trig1 nuevamente
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
●Los triggers recursivos son muy complejos y difíciles de implementar, pero brindan soluciones excelentes para relaciones autoreferenciadas.
111Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [6 | 7]
Consideraciones:La recursividad admite 32 niveles, y por defecto está deshabilitada
Las tablas inserted y deleted contienen las filas que corresponden sólo a las sentencias del último trigger
Si la opción de anidamiento está deshabilitada, también lo está la opción de recursividad
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
112Lab. Bases de Datos (EBB) | Unidad V - 2018
Anidamiento y recursividad [7 | 7]
Consideraciones:Si la opción de anidamiento está habilitada, la recursividad indirecta se puede producir, aunque la opción de recursividad esté deshabilitada
Para activar la recursividad:
sp_dboption nombre_db, 'recursive triggers', TRUE
ALTER DATABASE <bd> SET RECURSIVE_TRIGGERS ON
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
113Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [1 | 9]
Forzado de la integridad de datosLa tabla Reservas tiene las reservas que hacen los miembros de una biblioteca sobre los distintos libros
Cuando se presta un libro a un miembro, se registra el préstamo en la tabla Prestamos
Si el miembro tenía una reserva del libro, la misma debe borrarse de la tabla Reservas
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
114Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [2 | 9]
Forzado de la integridad de datos
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no mem_nomem_no
14431
14431
11212
11212
17431
17431
4 1 7 InserciónInserción
ReservasReservasReservasReservas
isbnisbn
11234
112344
mem_nomem_no
12117
121177
log_datelog_date
07/14/9807/12/9806/07/9807/14/9807/14/98
07/14/9807/12/9806/07/9807/14/9807/14/9807/14/98
remarksremarks
~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~Trigger borra filaTrigger borra fila
115Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [3 | 9]
Forzado de la integridad de datosCREATE TRIGGER reservation_deleteON loan FOR INSERT
AS
IF (SELECT r.member_no
FROM Reservas r JOIN inserted i ON r.member_no=i.member_no AND r.isbn=i.isbn) > 0
BEGIN
DELETE r FROM Reservas r JOIN inserted i
ON r.member_no = i.member_no AND r.isbn = i.isbn
END
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
116Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [4 | 9]
Forzado de las Reglas de NegocioLa tabla Miembros tiene los miembros de una biblioteca, los cuales pueden reservar libros
Cuando se presta un libro a un miembro, se registra el préstamo en la tabla Prestamos
Para poder borrar un miembro, el mismo no debe tener préstamos realizados
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
117Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [5 | 9]
Forzado de las Reglas de Negocio
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
membermembermembermember
member_nomember_no lastnamelastname firstnamefirstname
1234
1234
AndersonBarrBarrAnderson
AndersonBarrBarrAnderson
AndrewAndrewBillBill
AndrewAndrewBillBill
2 Barr Andrew
membermembermembermember
member_nomember_no lastnamelastname firstnamefirstname
134
134
AndersonBarrAnderson
AndersonBarrAnderson
AndrewBillBill
AndrewBillBill
MiembrosMiembrosMiembrosMiembros
member_nomember_no lastnamelastname firstnamefirstname
1234
1234
AndersonBarrBarrAnderson
AndersonBarrBarrAnderson
AndrewAndrewBillBill
AndrewAndrewBillBill
2 Barr Andrew
PrestamosPrestamosPrestamosPrestamos
isbnisbn copy_nocopy_no title_notitle_no mem_nomem_no
1443
1443
1121
1121
1443
1443
1123
11232
118Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [6 | 9]
Forzado de las Reglas de Negocio
IF (SELECT COUNT(*) FROM Prestamos p JOIN deleted d
ON p.member_no = d.member_no) > 0
ROLLBACK TRANSACTION
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
119Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [7 | 9]
AuditoríaLa tabla Productos tiene los productos que vende un negocio
Cada vez que se agrega un nuevo producto, se quiere saber, además del producto que se agregó, el usuario que lo hizo, desde qué máquina lo hizo y la fecha
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
120Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [8 | 9]
AuditoríaCREATE TABLE `AuditoriaProductos` ( `ID` INT NOT NULL AUTO_INCREMENT,
`Tipo` CHAR(1) NOT NULL, -- tipo de operación
`Fecha` DATETIME NOT NULL,
`Host` VARCHAR(45) NOT NULL, `Usuario` VARCHAR(45) NOT NULL,
`IDProducto` INT NOT NULL,
`Nombre` VARCHAR(60) NOT NULL, `Descripcion` TEXT NOT NULL,
PRIMARY KEY (`ID`)
);
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
121Lab. Bases de Datos (EBB) | Unidad V - 2018
Ejemplos [9 | 9]
AuditoríaDELIMITER //CREATE TRIGGER `Trig_Productos_Ins`
AFTER INSERT ON `Productos` FOR EACH ROW
BEGIN
INSERT INTO AuditoriaProductos VALUES (DEFAULT, 'I', NOW(),
SUBSTRING_INDEX(USER(), '@', -1),
SUBSTRING_INDEX(USER(), '@', 1), NEW.IDProducto, NEW.Nombre, NEW.Descripcion);
END //
DELIMITER ;
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Administración
Anidamiento y recursividad
Ejemplos
●En MySQL la función user() devuelve el usuario actual y la máquina como una cadena. Por ejemplo: 'juan@localhost'.
●La función substring_index() devuelve una subcadena de la cadena espeificada. En el primer caso, devuelve todo a la derecha del delimitador '@' ('localhost'), y en el segundo caso devuelve todo a la izquierda del delimitador '@' ('juan').
122Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [1 | 3]
Triggers DMLSe disparan cuando se modifican filas en una tabla (inserción, borrado, modificación)
Triggers DDLSe disparan cuando se ejecutan sentencias DDL (CREATE, ALTER, DROP, etc)
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
●DML: Data Manipulation Language.
●DDL: Data Definition Language
●A diferencia de los triggers DML, los cuales responden a cambios en los datos, los triggers DDL responden a acciones sobre los distintos objetos de la BD, por ejemplo, cuando se crea una tabla.
●Los triggers DDL están disponibles desde la versión 2005 de SQL Server. No son soportados por MySQL.
123Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [2 | 3]
Alcance de un trigger DDLNivel BD: se disparan cuando se produce un evento en una determinada BD
Nivel Servidor: se disparan independientemente de la BD usada
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
●Ejemplo de triggers DDL con alcance a nivel BD: manipulación de tablas, vistas, índices, usuarios, procedimientos almacenados, etc.
●Ejemplo de triggers DDL con alcance a nivel servidor: manipulación de logins, certificados de seguridad, etc.
124Lab. Bases de Datos (EBB) | Unidad V - 2018
Definición [3 | 3]
Proceso de un trigger DDLEjecución de una sentencia DDL
Realización de la acción de la sentencia DDL
Disparo del trigger DDL
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
●Los triggers DDL se disparan cuando se completa la acción que lo dispara. Por ejemplo, un trigger que se dispare cuando se borre una tabla, se disparará después de borrar la tabla (no hay un equivalente a los triggers INSTEAD OF para las operaciones DDL).
●Se puede retrotraer la acción haciendo ROLLBACK TRANSACTION, con lo cual se vuelve atrás toda la operación, incluyendo la operación DDL que disparó el trigger.
●Una única operación DDL puede disparar múltiples triggers. El orden en el que se disparan no está documentado.
125Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [1 | 5]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Los triggers DDL se crean con la sentencia CREATE TRIGGER, con algunas extensiones:
Nombre del trigger
Alcance del trigger: ON DATABASE | ON ALL SERVER
Evento del trigger: eventdata() y query()
●Cuando se crea un trigger DDL se debe especificar, además de su nombre, su alcance y evento que lo dispara.
●Para especificar un alcance a nivel BD se emplea “ON DATABASE”, y para el alcance a nivel servidor “ON ALL SERVER”.
●Los triggers DML crean las tablas inserted y deleted, no así los triggers DDL. Para éstos se puede usar la función eventdata() para obtener información sobre el evento que dispara el trigger. Luego, mediante el método query() se extrae información relacionada al evento.
126Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [2 | 5]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Función eventdata():Devuelve un documento XML cuyo contenido varía según el objetivo del trigger DDL
En todos estos documentos siempre está:<PostTime>: instante en el que se disparó el trigger<SPID>: ID del proceso que disparó el trigger<EventType>: tipo de evento que disparó el trigger
127Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [3 | 5]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Ejemplo: trigger para el comando UPDATE STATISTICS
<EVENT_INSTANCE> <PostTime>2004-06-18T02:14:20.640</PostTime>
<SPID>58</SPID>
<EventType>UPDATE_STATISTICS</EventType> <ServerName>SQL2005PC</ServerName>
<LoginName>SQL2005PC\Administrator</LoginName>
<UserName>SQL2005PC\Administrator</UserName> <DatabaseName>AdventureWorks</DatabaseName>
...
</EVENT_INSTANCE>
128Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [4 | 5]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Método query():Extrae información del evento a partir del documento generado por la función eventdata()
Ejemplo: para extraer el nombre de la BD:DECLARE @data XML
DECLARE @db NVARCHAR(100)
SET @data = eventdata()SET @db = CONVERT(NVARCHAR(100),
@data.query('data(//DatabaseName)'))
129Lab. Bases de Datos (EBB) | Unidad V - 2018
Creación [5 | 5]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Ejemplo:
CREATE TRIGGER UpdStatsON DATABASE FOR UPDATE_STATISTICS
AS
DECLARE @data XML DECLARE @db NVARCHAR(100)
SET @data = eventdata()
SET @db = CONVERT(NVARCHAR(100), @data.query('data(//DatabaseName)'))
PRINT @db
GO
130Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [1 | 2]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Información sobre triggers:Triggers de una tabla: sys.triggers.Definición del trigger: sys.sql_modules.
Modificación de un trigger:
ALTER TRIGGER UpdStats
ON DATABASE FOR UPDATE_STATISTICSAS
...
●Se puede obtener el listado de los triggers de una BD, incluyendo los triggers DDL, haciendo:
SELECT * FROM sys.triggers.
●Para ver la definición de un trigger:
SELECT * FROM sys.sql_modules.
●La sintaxis para modificar un trigger DDL es muy similar a la de un trigger DML. Se puede cambiar el evento que dispara el trigger, encriptar su definición, modificar el cuerpo, etc.
131Lab. Bases de Datos (EBB) | Unidad V - 2018
Administración [2 | 2]
Procedimientos almacenados
Parametrización
Triggers
Triggers DDL
Definición
Creación
Administración
Borrado de un trigger:
DROP TRIGGER UpdStats ON DATABASE
●Al borrar o modificar un trigger se debe especificar ON DATABASE u ON ALL SERVER. Si no se lo hace, SQL Server asume que se trata de un trigger DML, generándose un error.
132Lab. Bases de Datos (EBB) | Unidad V - 2018
Resumen [1 | 2]
Definición de procedimiento almacenadoCreación, modificación y borradoRecomendacionesProcedimientos almacenados con parámetros de entrada y salidaMensajes de errorManejo de erroresDefinición de triggerCreación, modificación y borrado
133Lab. Bases de Datos (EBB) | Unidad V - 2018
Resumen [2 | 2]
Anidamiento y recursividadEjemplosDefinición de trigger DDLCreación, modificación y borrado
134Lab. Bases de Datos (EBB) | Unidad V - 2018
Otro material [1 | 1]
Plan de ejecuciónhttps://www.simple-talk.com/sql/performance/execution-plan-basics/
Explain (MySQL)http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/
Top Related