Laboratorio de Bases de Datos

Documentos relacionados
Módulo VI: Procedimientos y Desencadenadores

Implementación de procedimientos almacenados

Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:

SUBPROGRAMAS PL/SQL César Martínez C. Profesor Instructor de Base de Datos Sede Puente Alto DUOC

Conceptos de Bases de Datos Relacionales Triggers

Unidad III. Bases de Datos

Implementación de Procedimientos Almacenados

PROCEDIMIENTOS ALMACENADOS

DISPARADORES EN SQL DISPARADORES EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999

TRIGGER LEONEL CADOSO ROMERO 1

MANUALITO MS-SQL SERVER

6. PROGRAMACIÓN CON TRANSACT-SQL

1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón

Implementación de Procedimientos Almacenados

Capítulo 1: Modelo conceptual

Objetivos y Temario CURSO MySQL 5

Modificación de datos

ÍNDICE. Introducción... Capítulo 1. Características, instalación, inicio y entorno de trabajo... 1

m047a Curso Programando una Base de Datos SQL Server 2008, 36 h

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Laboratorio Informix. Stored Procedures Triggers

Concepto de vista. (con ciertas limitaciones). nivel físico) Una vista es una tabla virtual (no tiene una correspondencia a

//Sección de manejo de excepciones. Las rutinas de manejo de errores //aparecen aqui

Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers

ÍNDICE INTRODUCCIÓN...17

Índice. iii. Objetivos... 24

Bases de Datos Relacionales

SQL SERVER SQL Server 2005 permite tres tipos de operaciones con conjuntos: UNION, disponible en todas las versiones de SQL Server.

8 ACCESS CURSO PRÁCTICO RA-MA

8 SQL SERVER 2008 RA-MA

Transacciones, copias de seguridad. Xochitl Clemente Parra Armando Méndez Morales

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS LABORATORIO DE BASES DE DATOS 1

PROCEDIMIENTOS ALMACENADOS. CREATE PROCEDURE nombreprocedimiento tipodato [=valordefecto]][,...]

GUÍA DE TRABAJO GRADO 11. Media Fortalecida - SENA Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

Introducción a Transact-SQL

Cursores, Triggers, Indices, Transacciones, Vistas Gestión y Modelación de Datos

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

MySQL 5 (versiones 5.1 a 5.6) Guía de referencia del desarrollador

ÍNDICE. Capítulo 1. Características, novedades y entorno de trabajo...13

Diseño e Implementación de Bases de Datos

Uso de Disparadores. Miguel Angel Garduño Cordova Isaac Méndez Hernández

8 MICROSOFT SQL SERVER 2008 R2. CURSO PRÁCTICO RA-MA

Pre-Taller Gestión de Privilegios de Usuarios 2. Manipulación de Vistas 3. Creación y manipulación de Triggers (Introducción al uso de PL/pgsql)

Base de Datos Oracle 10g: Programación con PL/SQL Código: D Duración: 5 días (40 horas)

Cadena de caracteres Numéricas Fecha y hora Booleanas Tipo registro Tipo cursor

8283: Administración y programación en Microsoft SQL Server 2012

ÍNDICE. Introducción... XVII. Capítulo 1. Oracle 10g y el Grid Computing... 1

Checks, Triggers y Excepciones en InterBase: validando desde la base de datos

Tema: Procedimientos almacenados y cursores. Facultad : Ingeniería Escuela : Computación Asignatura: SQL SERVER. GUÍA 2 Pág. 1

SQL Server FEMEPA SQL Server 2000

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

Tema 5. Lenguaje de Definición de Datos

ÍNDICE PRIMERA PARTE... 17

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

Bases de Datos / Elementos de Bases de Datos Que es un Stored Procedure? Stored Procedures: Ventajas

PROCEDIMIENTOS ALMACENADOS Y TRIGGERS. Bases de Datos Ingeniería de Sistemas y Computación Universidad Nacional de Colombia 2007

Procedimientos almacenados con parametros de salida

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

El Lenguaje SQL TEMA V. Grupo de Bas ses de Datos Avanzadas Univ. Carlo os III de Madrid. V.1 SQL como Lenguaje de Definición de Datos

Vistas en MS SQL Server. Bases de Datos I Universidad Católica II Cuatrimestre

A.1. Definiciones de datos en SQL

Modulo I: Introducción Gestores de Bases De Datos

Tema 33. El lenguaje SQL

GALA CONCEPTO COMMIT, ROOLBACK SAVEPOINTS (SAVE TRANSACTION) No Consultas. Definiciones Transacciones ( L33 )

ÍNDICE INTRODUCCIÓN...13

Administración Base de Datos SQL

GUIA 3 PARTE II. Introducción a PL/SQL

En este curso se presenta un análisis profundo de la base de datos MySQL para los sistemas operativos Windows y Linux.

UNIVERSIDAD DON BOSCO

SQL (Structured Query Language)

Introducción al SQL de InterBase: DDL y DML

Triggers 27/11/2014. Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers en Oracle

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

ORACLE 10g. Descripción A QUIEN VA DIRIGIDO?

Diseño e Implementación SQL Server

Programación SQL. Lucio Salgado Diciembre 2008

Procedimientos almacenados

Consultas con combinaciones

Oracle PL/SQL. Programa de Estudio.

Curso Querying Microsoft SQL Server 2014 (20461)

GESTORES GESTORES DE BASES DE DATOS

GBD Diseño físico de DDBB

1. DML. Las consultas de resumen

Bases de Datos / Elementos de Bases de Datos 2015

Implementación de funciones definidas por el usuario

Funciones Definición de función

LENGUAJE DE CONSULTA ESTRUCTURADO - SQL CONTENIDO

Maestría en Bioinformática. Bases de Datos y Sistemas de Información SQL: DML. Ing. Alfonso Vicente, PMP

SERVICIO NACIONAL DE APRENDIZAJE SENA SISTEMA INTEGRADO DE GESTIÓN Procedimiento Ejecución de la Formación Profesional Integral GUÍA DE APRENDIZAJE

Integridad Referencial. Restricciones (constraints)

INSTITUTO DE EDUCACIÓN SUPERIOR TECNOLÓGICO IBEROTEC SEMESTRE ACADÉMICO: 2014-II SÍLABO

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

Configuración de MySQL con NetBeans

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

LENGUAJE ESTRUCTURADO DE CONSULTAS SQL (2)

Diseño de bases de datos

Transcripción:

Laboratorio de Bases de Datos Unidad V Departamento de Electricidad, Electrónica y Computación Facultad de Ciencias Exactas y Tecnología Universidad Nacional de Tucumán Primer Semestre 2016

Introducción [1 4] Creación Recomendaciones Modificación y borrado 2

Introducción [2 4] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores 3

Introducción [3 4] Administración Anidamiento y recursividad Ejemplos 4

Introducción [4 4] Creación Administración 5

[1 24] Creación Recomendaciones Modificación y borrado Procedimiento Almacenado (Stored Procedure): Colección de sentencias SQL, con un nombre, almacenadas en el servidor dentro de la BD. Finalidad: Encapsular tareas repetitivas 6

[2 24] Creación Recomendaciones Modificación y borrado 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. 7

[3 24] Creación Recomendaciones Modificación y borrado Tipos: Del sistema Locales Temporales Remotos Extendidos 8

[4 24] Creación Recomendaciones Modificación y borrado del sistema: Devuelven información de las tablas 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 9

[5 24] Creación Recomendaciones Modificación y borrado locales: Creados en las BD de usuario individuales. temporales: En SQL Server sus nombres empiezan con # o ## (si son locales o globales). No son soportados por MySQL. 10 Los procedimientos almacenados temporales se crean siempre en la BD tempdb.

[6 24] Creación Recomendaciones Modificación y borrado remotos: Soportan la funcionalidad de consultas y operaciones distribuidas. extendidos: Se ejecutan fuera del ambiente del servidor. No son soportados por MySQL. En SQL Server, sus nombres comienzan con xp_. 11 Los procedimientos almacenados extendidos son funciones dentro de una DLL que incrementan la funcionalidad de SQL Server. Ejemplo: EXEC master..xp_cmdshell 'dir c:\'

[7 24] Creación Recomendaciones Modificación y borrado Ventajas: 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. 12 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 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.

[8 24] Creación Recomendaciones Modificación y borrado Ventajas: Mejoran el rendimiento. Reducen el tráfico en la red. Reducen la vulnerabilidad debido a los ataques de SQL injection. 13 Los procedimientos almacenados implementan varias tareas mediante una serie de sentencias SQL. Se puede aplicar lógica condicional a los resultados de las primeras sentencias para determinar las siguientes. Todas estas sentencias forman parte de un único plan de ejecución. En vez de mandar miles de sentencias SQL por la red, los usuarios mandan una única sentencia (el llamado al procedimiento) y reciben la 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.

[9 24] Creación Recomendaciones Modificación y borrado Ejemplo #1 de SQL injection: 1. Campo de texto llamado UserId 2. Se lee el campo de texto: txtuserid = getrequeststring("userid"); 3. Se arma la sentencia SQL: txtsql="select * FROM Users WHERE UserId=" + txtuserid; 14

[10 24] Creación Recomendaciones Modificación y borrado Ejemplo #1 de SQL injection: 4. Se ingresa 105 or 1=1 en el campo de texto 5. La sentencia quedaría: SELECT * FROM Users WHERE UserId = 105 or 1=1 6. Como 1=1 siempre es True, se muestra todo el contenido de la tabla Users 15

[11 24] Creación Recomendaciones Modificación y borrado Ejemplo #2 de SQL injection: 1. Campo de texto llamado UserId 2. Se lee el campo de texto: txtuserid = getrequeststring("userid"); 3. Se arma la sentencia SQL: txtsql="select * FROM Users WHERE UserId=" + txtuserid; 16

[12 24] Creación Recomendaciones Modificación y borrado Ejemplo #2 de SQL injection: 4. Se ingresa 105; DROP TABLE Suppliers en el campo de texto 5. La sentencia quedaría: SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers 6. Se borra toda la tabla Suppliers 17

[13 24] Creación Recomendaciones Modificación y borrado 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 18 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).

[14 24] Creación Recomendaciones Modificación y borrado Procesos que se realizan cuando se ejecuta una consulta: Análisis sintáctico (parsing) Normalización Compilación Optimización 19 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.

[15 24] Creación Recomendaciones Modificación y borrado Análisis sintáctico (parsing): Controla que consulta esté bien escrita, es decir, bien formada. No se controlan los nombres de los objetos o columnas. La salida de este proceso se llama árbol de consulta. 20

[16 24] Creación Recomendaciones Modificación y borrado Normalización: Verifica los nombres de objetos y columnas, los tipos de datos, la presencia de funciones de agregación, 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. 21

[17 24] Creación Recomendaciones Modificación y borrado 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. 22

[18 24] Creación Recomendaciones Modificación y borrado 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. 23 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.

[19 24] Creación Recomendaciones Modificación y borrado 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. 24 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 agregación, en lugar de consumir tiempo intentando calcular el plan más óptimo, el optimizador puede utilizar un plan simple

[20 24] Creación Recomendaciones Modificación y borrado 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). 25

[21 24] Creación Recomendaciones Modificación y borrado 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). 26 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.

[22 24] Creación Recomendaciones Modificación y borrado 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). La reutilización de los planes de ejecución es una de las mayores ventajas de los procedimientos. 27

[23 24] Creación Recomendaciones Modificación y borrado 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 XML. SET SHOWPLAN_TEXT ON: plan de ejecución estimado en formato texto. SET STATISTICS XML ON: plan de ejecución real en formato XML. SET STATISTICS PROFILE ON: plan de ejecución real en formato texto. 28

[24 24] Creación Recomendaciones Modificación y borrado 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. 29

Creación [1 8] Creación Recomendaciones Modificación y borrado Consideraciones: Se emplea la sentencia CREATE PROCEDURE. Pueden referenciar tablas, procedimientos y tablas temporales. vistas, otros En SQL Server la sentencia CREATE PROCEDURE es un batch por si mismo. 30 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.

Creación [2 8] Creación Recomendaciones Modificación y borrado SQL Server: CREATE PROC esquema1.overdue_books AS SELECT * FROM esquema2.loan WHERE due_date < GETDATE() GO 31 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.

Creación [3 8] Creación Recomendaciones Modificación y borrado MySQL: DELIMITER // CREATE PROCEDURE verempleados() BEGIN SELECT * FROM Employees; END // DELIMITER ; 32 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.

Creación [4 8] Creación Recomendaciones Modificación y borrado Ejecución en SQL Server: se emplea la sentencia EXECUTE seguida del nombre del procedimiento y sus parámetros. EXECUTE esquema1.overdue_books Ejecución en MySQL: se emplea la sentencia CALL seguida del nombre del procedimiento y sus parámetros. CALL verempleados(); 33 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.

Creación [5 8] Creación Recomendaciones Modificación y borrado 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 esquema1.customers EXEC esquema2.employee_customer 34 Para que funcione el ejemplo, la tabla debe existir y los tipos de datos y columnas deben coincidir con lo devuelto por el procedimiento.

Creación [6 8] Creación Recomendaciones Modificación y borrado Los procedimientos pueden anidarse (un procedimiento llama a otro): El nivel nivel de anidamiento es limitado. Si un P1 llama a P2, P2 puede acceder a todos los objetos definidos localmente en P1. 35 En SQL Server puede haber hasta 32 niveles de anidamiento, y la variable @@nestlevel guarda el nivel de anidamiento actual.

Creación [7 8] Creación Recomendaciones Modificación y borrado 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 36

Creación [8 8] Creación Recomendaciones Modificación y borrado En MySQL: Para ver información sobre un procedimiento: SHOW CREATE PROCEDURE nombre; Para obtener una lista de procedimientos: SHOW PROCEDURE STATUS; 37

Recomendaciones [1 2] Creación Recomendaciones Modificación y borrado 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. 38 Para evitar romper la cadena de permisos, se recomienda que el usuario dbo sea el dueño de los procedimientos (similar a las vistas).

Recomendaciones [2 2] Creación Recomendaciones Modificación y borrado 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. 39 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.

Creación Recomendaciones Modificación y borrado 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. 40 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 procedimiento. Para esto resulta de utilidad el comando SHOW CREATE PROCEDURE, el cual muestra la definición del mismo, junto con sus parámetros.

Creación Recomendaciones Modificación y borrado Modificación y borrado [2 6] Ejemplo SQL Server: ALTER PROC esquema1.overdue_books AS SELECT CONVERT(char(8),due_date,1) due_date, isbn, copy_no, SUBSTRING(title, 1, 30) title, member_no, lastname FROM esquema2.overdueview ORDER BY due_date GO 41 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).

Creación Recomendaciones Modificación y borrado 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 (al externo). Se necesita tener determinados permisos. 42 Si P1 llama a P2, y se modifica P1, el cambio es en P1 (P2 no se ve afectado). Cuando se modifica un procedimiento, se mantienen los permisos del mismo.

Creación Recomendaciones Modificación y borrado Modificación y borrado [4 6] A veces es necesario recompilar el plan de ejecución: Se agregan/borran/modifican índices Se cambian los datos en columnas indexadas Esta recompilación se produce automáticamente: Cuando SQL Server ejecuta la consulta por primera vez. Se cambian las tablas subyacentes. Esta opción no está disponible en MySQL. 43

Creación Recomendaciones Modificación y borrado 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. 44 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.

Creación Recomendaciones Modificación y borrado Modificación y borrado [6 6] Borrado de un procedimiento (SQL Server): DROP PROC[EDURE] esquema1.overdue_books Borrado de un procedimiento (MySQL): DROP PROCEDURE verempleados; 45 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.

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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. 46

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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. 47 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().

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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 procedimiento. tienen un ámbito local al 48

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [4 11] SQL Server: @parámetro tipo_dato [ = valor_defecto] CREATE PROC dbo.find_isbn @title longstring, @translation char(8) = 'English' AS IF @title is null BEGIN PRINT "Please provide a title"... 49

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [5 11] MySQL: parámetro tipo_dato DELIMITER // CREATE PROCEDURE verempleado(ide INTEGER) BEGIN SELECT * FROM Employees WHERE EmployeeID = ide; END // DELIMITER ; 50

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [6 11] Llamada a un procedimiento con parámetros de entrada: SQL Server Por referencia Por posición MySQL Por posición 51 En el caso de SQL Server, no se puede mezclar ambas formas durante el llamado del procedimiento.

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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. 52 Si se omiten parámetros, se adoptan los valores por defecto o el valor nulo.

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [8 11] Llamada por referencia: EXEC addadult @firstname = 'Linda', @lastname = 'LaBrie', @street = 'Dogwood Drive', @city = 'Sacramento', @state = 'CA', @zip = '94203' 53 Si se omiten parámetros, se adoptan los valores por defecto o el valor nulo.

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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. 54

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [10 11] Llamada por posición (SQL Server): EXEC addadult 'LaBrie', 'Linda', null, 'Dogwood Drive', 'Sacramento', 'CA', '94203', null 55

Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Parámetros de entrada [11 11] Llamada por posición (MySQL): Se pasan los valores en el mismo orden en que fue definidos el procedimiento. Se usan también valores nulos como parámetros. CALL verempleado('sales Rep.', 'Ms.'); 56

Parámetros de salida [1 5] Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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 dbo.mathtutor @m1 smallint, @m2 smallint, @resultado smallint OUTPUT AS SET @resultado = @m1 * @m2 GO 57

Parámetros de salida [2 5] Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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. 58

Parámetros de salida [3 5] Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Ejemplo en MySQL: DELIMITER // CREATE PROCEDURE cantempleados(toc VARCHAR(25), out cantidad integer) BEGIN SELECT count(employeeid) INTO cantidad FROM Employees WHERE TitleOfCourtesy = toc; END // DELIMITER ; 59

Parámetros de salida [4 5] Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores 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 @answer smallint EXEC mathtutor 5, 6, @answer OUTPUT SELECT 'El resultado es: ', @answer 60 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.

Parámetros de salida [5 5] Parámetros de entrada Parámetros de salida Valores de retorno Manejo de errores Llamada a un procedimiento con parámetros de salida: MySQL DECLARE @cant integer CALL cantempleados('sales', 'Ms.', @cant); SELECT @cant; 61

Mensajes de error [1 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores 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 RETURN Procedimiento sp_addmessage Función @@error Sentencia RAISERROR 62 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).

Mensajes de error [2 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Mensajes de error con la 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. 63 La sentencia RETURN sale de una consulta o procedimiento incondicionalmente.

Mensajes de error [3 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo de RETURN: ALTER PROC unprocedimiento @name varchar(30), @IDDept smallint OUTPUT AS IF (@name = '') RETURN -1... SET @IDDept = SCOPE_IDENTITY() RETURN 0 GO 64 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.

Mensajes de error [4 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo de RETURN: DECLARE @dept int, @result int EXEC @result = unprocedimiento '', @dept OUTPUT IF (@result = 0) SELECT @dept ELSE SELECT 'Error durante la inserción' 65 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).

Mensajes de error [5 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Mensajes de error con el 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 Sucesos de Windows. 66 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).

Mensajes de error [6 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo de sp_addmessage: EXEC sp_addmessage @msgnum = 50011, @severity = 10, @msgtext = El registro no puede ser borrado, @with_log = TRUE 67 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).

Mensajes de error [7 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Mensajes de error con la 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 satisfactoriamente. la sentencia se ejecuta 68 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).

Mensajes de error [8 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo de @@error:.. IF @error <> 0 BEGIN ROLLBACK TRAN RETURN END COMMIT TRAN 69 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).

Mensajes de error [9 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Mensajes de error con la 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 Sucesos de Windows. 70 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).

Mensajes de error [10 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo de 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 71 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).

Mensajes de error [11 11] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores En MySQL, para implementar los mensajes de error se 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 ; 72 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).

Manejo de errores [1 4] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores SQL Server permite gestionar el tratamiento de excepciones en cualquier situación transaccional, como ser un procedimiento almacenado. Bloque TRY/CATCH TRY: contiene las transacciones protegidas CATCH: gestiona los errores 73 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.

Manejo de errores [2 4] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Ejemplo: CREATE PROCEDURE dbo.adddata @a int, @b int AS BEGIN TRY INSERT INTO TableWithKey VALUES (@a, @b) END TRY BEGIN CATCH SELECT ERROR_NUMBER(), ERROR_MESSAGE() END CATCH 74 En este ejemplo el procedimiento intenta agregar 2 valores en una tabla, cuya primer columna es una clave primaria entera. El bloque TRY/CATCH protege a la sentencia INSERT y devuelve el número de error y mensaje en caso de producirse un problema mediante las funciones error_number() y error_message().

Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores 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 Contemplar el XACT_STATE uso de XACT_ABORT ON y 75 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. La opción XACT_ABORT especifica si SQL Server hace un roll back de la transacción actual automáticamente cuando una sentencia genera un error en tiempo de ejecución (ver pág. 344)

Manejo de errores [4 4] Parámetros de entrada Parámetros de salida Mensajes de error Manejo de errores Recomendaciones: Si es necesario, capturar la información del error ERROR_LINE ERROR_MESSAGE ERROR_NUMBER ERROR_PROCEDURE ERROR_SEVERITY ERROR_STATE 76 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.

[1 5] Administración Anidamiento y recursividad Ejemplos 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. 77 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.

[2 5] Administración Anidamiento y recursividad Ejemplos Características: Se usan para mantener la integridad de datos. No devuelven valores. Su principal ventaja es que manejan complejidad de procesamiento. 78 Aunque un trigger puede devolver valores, no tiene sentido (las aplicaciones no lo esperan).

[3 5] Administración Anidamiento y recursividad Ejemplos Características: Son reactivos mientras que (constraints) son proactivas. las restricciones 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. 79 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.

[4 5] Administración Anidamiento y recursividad Ejemplos Características: 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. 80 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.

[5 5] Administración Anidamiento y recursividad Ejemplos Usos: Cambios en cascada de tablas relacionadas. Forzado de integridad de datos de manera compleja. de mensajes de error de usuario Comparación de estados antes y después 81 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. 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.

Administración [1 25] Administración Anidamiento y recursividad Ejemplos Tipos de triggers en SQL Server: AFTER: Se ejecutan después que se produce la acción. Sólo se pueden definir en tablas. Se pueden definir varios en una misma tabla. INSTEAD OF: Se ejecutan en lugar de la acción usual del trigger. Se pueden definir también en vistas (1 por tabla o vista). 82 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.

Administración [2 25] Administración Anidamiento y recursividad Ejemplos Si una tabla tiene definidas restricciones, triggers AFTER e INSTEAD OF: Las restricciones se verifican después de la ejecución de los triggers INSTEAD OF, pero antes de la de los AFTER. Si se violan las restricciones, las acciones de los triggers INSTEAD OF se vuelven atrás y los triggers AFTER nunca se disparan. 83 Los triggers reactivos con respecto a las restricciones son los AFTER. Los triggers INSTEAD OF son proactivos.

Administración [3 25] Administración Anidamiento y recursividad Ejemplos 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. 84 Los triggers del tipo INSTEAD OF están disponibles a partir de la versión 2005 de SQL Server.

Administración [4 25] Administración Anidamiento y recursividad Ejemplos Los triggers se crean con la sentencia CREATE TRIGGER: Nombre del trigger. La tabla a la cual pertenece el trigger. El o los eventos por los que se dispara el trigger. El cuerpo del procedimiento. 85 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 o los eventos por los que se dispara y el cuerpo del procedimiento.

Administración [5 25] Administración Anidamiento y recursividad Ejemplos Consideraciones: Para crear un trigger se requiere determinados permisos. Claúsula IF UPDATE (SQL Server). Cadena de permisos (SQL Server). 86 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 el dbo sea dueño de los objetos subyacentes para no romper la cadena de permisos.

Administración [6 25] Administración Anidamiento y recursividad Ejemplos Consideraciones: Pueden aceptar cualquier sentencia SQL, salvo: Todas las sentencias CREATE y DROP ALTER (TABLE, DATABASE, PROCEDURE, VIEW y TRIGGER) GRANT, REVOKE y DENY UPDATE STATISTICS RECONFIGURE LOAD DATABASE y RESTORE DATABASE 87 Es recomendable que el dbo sea dueño de los objetos subyacentes para no romper la cadena de permisos.

Administración [7 25] Administración Anidamiento y recursividad Ejemplos Trigger para inserción: Se dispara al agregar filas a la tabla en la que está creado. Cuando 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 agregaron. Se pueden referenciar las filas de la tabla inserted o NEW desde el trigger. 88 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.

Administración [8 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para inserción: Se tiene la tabla Prestamos con un trigger para inserción: Prestamos Prestamos isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 33 11 22 11 1001 1001 1001 1001 1004 1004 1002 1002 1002 1002 1003 1003 02/13/91 02/13/91 02/14/91 02/14/91 02/14/91 02/14/91 duedate duedate 02/27/91 02/27/91 02/28/91 02/28/91 02/28/91 02/28/91 89

Administración [9 25] Administración Anidamiento y recursividad Ejemplos 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)) loan loan isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 4603 4343 33 11 141212 2121 11 1001 1001 1004 1004 11 1004 1002 1004 1002 1004 1002 1002 duedate duedate 1001 1001 02/13/91 02/13/91 02/27/91 02/27/91 1002 1001 02/14/91 02/13/91 02/28/91 02/27/91 1001 123 02/13/91 02/15/91 02/27/91 03/17/91 1002 02/13/91 1001 02/14/91 02/27/91 02/28/91 1003 1002 1003 02/14/91 1002 02/14/91 02/28/91 02/28/91 1003 1003 02/14/91 02/14/91 02/28/91 02/28/91 90

Administración [10 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para inserción: Se dispara el trigger registrando la inserción en la tabla inserted o NEW: Prestamos loan loan Prestamos isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 4603 4343 33 11 141212 2121 11 inserted inserted//new NEW 603 4 603 4 1001 1001 1004 1004 11 1004 1002 1004 1002 1004 1002 1002 11 11 duedate duedate 1001 1001 02/13/91 02/13/91 02/27/91 02/27/91 1002 1001 02/14/91 02/13/91 02/28/91 02/27/91 1001 123 02/15/91 03/17/91 1002 02/13/91 1001 02/14/9102/27/91 02/13/91 02/28/91 02/27/91 1003 1002 02/14/91 02/28/91 1003 02/14/91 02/28/91 1002 1003 1003 02/14/91 02/14/91 02/28/91 02/28/91 123 123 02/15/91 02/15/91 03/17/91 03/17/91 91

Administración [11 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para inserción: Se ejecuta el cuerpo del trigger: CREATE TRIGGER prestamos_insert ON Prestamos AFTER INSERT AS Copias UPDATE c Copias isbn isbn copy_no copy_no title_no title_no on_loan on_loan SET on_loan = 'Y' 1 1 1001 YY 1 1 1001 FROM Copias c INNER JOIN inserted I 44 1004 603 411 11 YY 1004 ON c.isbn = i.sbn AND 44 22 1004 N 1004 N c.copy_no = i.copy_no 33 11 1002 1002 NN GO 92 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.

Administración [12 25] Administración Anidamiento y recursividad Ejemplos Trigger para inserción en MySQL: DELIMITER // CREATE TRIGGER Telefonos_Insert AFTER INSERT ON Telefonos FOR EACH ROW BEGIN -- cuerpo del trigger END// DELIMITER ; 93 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.

Administración [13 25] Administración Anidamiento y recursividad Ejemplos Trigger para borrado: Se dispara al borrar filas de la tabla en la que está creado. Cuando 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 borraron. Se pueden referenciar las filas de la tabla deleted u OLD desde el trigger. 94 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. En MySQL? La tabla OLD es insensible a mayúsculas.

Administración [14 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para borrado: Se tiene la tabla Prestamos con un trigger para borrado: Prestamos Prestamos isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 33 11 22 11 1001 1001 1001 1001 1004 1004 1002 1002 1002 1002 1003 1003 02/13/91 02/13/91 02/14/91 02/14/91 02/14/91 02/14/91 duedate duedate 02/27/91 02/27/91 02/28/91 02/28/91 02/28/91 02/28/91 95

Administración [15 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para borrado: Se borra una fila de la tabla Prestamos: DELETE Prestamos WHERE isbn = 4 AND copy_no = 1 Prestamos Prestamos isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 44 33 11 11 22 11 1001 1001 1004 1004 1004 1004 1002 1002 1001 1001 1001 1001 1002 1002 1003 1003 02/13/91 02/13/91 02/13/91 02/13/91 02/14/91 02/14/91 02/14/91 02/14/91 duedate duedate 02/27/91 02/27/91 02/27/91 02/27/91 02/28/91 02/28/91 02/28/91 02/28/91 96

Administración [16 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para borrado: Se dispara el trigger registrando la inserción en la tabla deleted u OLD: Prestamos Prestamos isbn isbn copy_no copy_no title_no title_no mem_no mem_no outdate outdate 11 44 33 11 22 11 deleted deleted//old OLD 44 11 1001 1001 1001 1001 1004 1004 1002 1002 1002 1003 1002 1003 1004 1004 02/13/91 02/13/91 02/14/91 02/14/91 02/14/91 02/14/91 1001 1001 duedate duedate 02/27/91 02/27/91 02/28/91 02/28/91 02/28/91 02/28/91 02/13/91 02/13/91 02/27/91 02/27/91 97

Administración [17 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para borrado: Se ejecuta el cuerpo del trigger: CREATE TRIGGER prestamos_delete ON Prestamos AFTER 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 Copias Copias isbn isbn copy_no copy_no title_no title_no on_loan on_loan 11 44 44 33 11 11 22 11 1001 1001 1004 1004 1004 1004 1002 1002 YY YY N NN NN 98 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.

Administración [18 25] Administración Anidamiento y recursividad Ejemplos Trigger para modificación: Se dispara al modificar filas en la tabla en la que está creado. Cuando se dispara las filas originales se mueven a la tabla deleted u OLD, y las filas modificadas se insertan a la tabla inserted o NEW. Se pueden referenciar las filas de estas tablas desde el trigger. 99 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.

Administración [19 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para modificación: Se modifica una fila de la tabla Miembros, la cual tiene un trigger para modificación: UPDATE Miembros SET member_no = 10021 WHERE member_no = 1234 Miembros Miembros member_no member_no lastname lastname firstname firstname middleinitial middleinitial photograph photograph 10020 10020 10021 1234 10021 10022 10022 10023 10023 Anderson Anderson Barr Barr Barr Barr Anderson Anderson Andrew Andrew AA Andrew Andrew RR Bill NULL Bill NULL Bill BB Bill ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ 100

Administración [20 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para modificación: Se registra la modificación como 2 pasos: deleted deleted//old OLD 1234 Barr Andrew 1234 Barr Andrew RR ~~~ ~~~ inserted inserted//new NEW 10021 Barr Andrew 10021 Barr Andrew RR ~~~ ~~~ 101

Administración [21 25] Administración Anidamiento y recursividad Ejemplos Ejemplo de trigger para modificación: Se ejecuta el cuerpo del trigger: CREATE TRIGGER member_update ON Miembros AFTER UPDATE Miembros Miembros AS member_no member_no lastname lastname firstname firstname middleinitial middleinitial photograph photograph IF UPDATE (member_no) 10020 Anderson ~~~ 10020 Anderson Andrew Andrew AA ~~~ 10021 Andrew 1234 Barr R ~~~ BEGIN 10021 Barr Andrew R ~~~ 10022 Barr Bill NULL ~~~ 10022 Barr Bill NULL ~~~ RAISERROR ('Error', 10, 1) 10023 Anderson Bill BB 10023 Anderson Bill ROLLBACK TRANSACTION... 102 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.

Administración [22 25] Administración Anidamiento y recursividad Ejemplos Modificación de un trigger (SQL Server): Sentencia ALTER TRIGGER ALTER TRIGGER prestamos_insert ON Prestamos AFTER INSERT AS 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 103 Igual que en caso de los procedimientos almacenados, MySQL no soporta la modificación de triggers.

Administración [23 25] Administración Anidamiento y recursividad Ejemplos Borrado de un trigger: Sentencia DROP TRIGGER DROP TRIGGER prestamos_insert Cuando la tabla se borra, se borran todos sus triggers. El permiso para borrar un trigger lo tiene el dueño de la tabla únicamente. 104

Administración [24 25] Administración Anidamiento y recursividad Ejemplos Información sobre triggers: SQL Server: de una tabla: sp_depends tabla. del trigger: sp_helptext trigger. MySQL Información sobre triggers: SELECT * FROM information_schema.triggers 105

Administración [25 25] Administración Anidamiento y recursividad Ejemplos 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 referenciadas. Número de filas afectadas. 106

Administración Anidamiento y recursividad Ejemplos 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 MySQL no soporta el anidamiento de triggers. 107

Administración Anidamiento y recursividad Ejemplos 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. 108 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 llama 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.

Administración Anidamiento y recursividad Ejemplos Anidamiento y recursividad [3 7] Razones para desactivar el anidamiento: Requiere un diseño planeado y una complejidad apreciable. Las modificaciones de las tablas no siguen el orden esperado. Para desactivar el anidamiento: sp_configure 'nested triggers', 0 109 Cuando se deshabilita la opción de anidamiento, si un trigger modifica una tabla, esta modificación no dispara el trigger asociado.

Administración Anidamiento y recursividad Ejemplos 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. 110

Administración Anidamiento y recursividad Ejemplos 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. 111 Los triggers recursivos son muy complejos y difíciles de implementar, pero brindan soluciones excelentes para relaciones autoreferenciadas.

Administración Anidamiento y recursividad Ejemplos 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. 112

Administración Anidamiento y recursividad Ejemplos 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 113

Ejemplos [1 9] Administración Anidamiento y recursividad Ejemplos Forzado de la integridad de datos La 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. 114

Ejemplos [2 9] Administración Anidamiento y recursividad Ejemplos Forzado de la integridad de datos Prestamos Prestamos Reservas Reservas isbn isbn copy_no copy_no mem_no mem_no 11 44 44 33 11 11 11 22 11 22 11 77 44 33 11 isbn isbn mem_no mem_no log_date log_date remarks remarks Inserción Inserción Trigger Triggerborra borrafila fila 11 11 22 33 44 11 22 11 11 77 07/14/98 07/14/98 07/12/98 07/12/98 06/07/98 06/07/98 07/14/98 07/14/98 07/14/98 07/14/98 ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ ~~~ 115

Ejemplos [3 9] Administración Anidamiento y recursividad Ejemplos Forzado de la integridad de datos CREATE TRIGGER reservation_delete ON 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 116

Ejemplos [4 9] Administración Anidamiento y recursividad Ejemplos Forzado de las Reglas de Negocio La 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. 117

Ejemplos [5 9] Administración Anidamiento y recursividad Ejemplos Forzado de las Reglas de Negocio Miembros member member Miembros member_no member_no 11 2323 3434 44 Prestamos Prestamos lastname lastname firstname firstname isbn isbn Anderson Anderson Barr Barr Anderson Barr Anderson Barr Anderson Anderson Andrew Andrew Andrew Bill Bill Andrew Bill Bill Bill Bill 11 44 44 33 copy_no copy_no title_no title_no mem_no mem_no 11 11 22 11 11 44 44 33 11 11 22 33 118

Ejemplos [6 9] Administración Anidamiento y recursividad Ejemplos 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 119

Ejemplos [7 9] Administración Anidamiento y recursividad Ejemplos Auditoría La 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. 120

Ejemplos [8 9] Administración Anidamiento y recursividad Ejemplos Auditoría CREATE 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`) ); 121

Ejemplos [9 9] Administración Anidamiento y recursividad Ejemplos Auditoría DELIMITER // 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 ; 122 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').

Creación Administración [1 3] DML Se disparan cuando se modifican filas en una tabla (inserción, borrado, modificación) Se disparan cuando se ejecutan sentencias DDL (CREATE, ALTER, DROP, etc) DML: Data Manipulation Language. DDL: Data Definition Language 123 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.

Creación Administración [2 3] Alcance de un trigger DDL Nivel BD: se disparan cuando se produce un evento en una determinada BD. Nivel Servidor: se disparan independientemente de la BD usada. 124 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.

Creación Administración [3 3] Proceso de un trigger DDL Ejecución de una sentencia DDL Realización de la acción de la sentencia DDL Disparo del trigger DDL 125 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.

Creación Administración Creación [1 5] 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() 126 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.

Creación Administración Creación [2 5] 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 127

Creación Administración Creación [3 5] 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> 128

Creación Administración Creación [4 5] 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)')) 129

Creación Administración Creación [5 5] Ejemplo: CREATE TRIGGER UpdStats ON 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 130

Creación Administración Administración [1 2] Información sobre triggers: de una tabla: sys.triggers. del trigger: sys.sql_modules. Modificación de un trigger: ALTER TRIGGER UpdStats ON DATABASE FOR UPDATE_STATISTICS AS... 131 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.

Creación Administración Administración [2 2] Borrado de un trigger: DROP TRIGGER UpdStats ON DATABASE 132 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.

Resumen [1 2] de procedimiento almacenado Creación, modificación y borrado Recomendaciones con parámetros de entrada y salida Mensajes de error Manejo de errores de trigger Creación, modificación y borrado 133

Resumen [2 2] Anidamiento y recursividad Ejemplos de trigger DDL Creación, modificación y borrado 134

Otro material [1 1] Plan de ejecución https://www.simpletalk.com/sql/performance/execution-plan-basics/ Explain (MySQL) http://www.sitepoint.com/using-explain-to-writebetter-mysql-queries/ 135