Вы находитесь на странице: 1из 19

Curso SQL Server 2000 Captulo 3

CURSO SQL SERVER 2000


Dictado por Horacio Peafiel

Mdulo 9: Procedimientos Almacenados y Triggers

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

MDULO 5 PROCEDIMIENTOS ALMACENADOS Y TRIGGERS Transact-SQL (T-SQL) es el lenguaje nativo de SQL Server 2000 para la programacin del servidor de bases de datos. Luego de completar este mdulo, estaremos en condiciones de: Comprender el funcionamiento de Procedimientos Almacenados en SQL Server 2000. Destacar el papel que juegan los desencadenadores (Triggers) en SQL Server.

5.1 INTRODUCCIN A LOS PROCEDIMIENTOS ALMACENADOS En los mdulos anteriores, usamos el Analizador de Consultas para crear, ejecutar, y guardar comandos y lotes Transact-SQL usando este lenguaje. Cuando estos scripts eran ejecutados, los comandos dentro de los mismos eran procesados por SQL Server para devolver conjuntos de resultados, administrar el servidor, o para manipular datos contenidos en una base de datos. Cuando los scripts eran guardados, se almacenaban como un archivo y se les daba una extensin .sql. Alternativamente, los scripts en T-SQL pueden ser almacenados en SQL Server como Procedimientos Almacenados. Podemos invocar procedimientos almacenados de varias formas, ya sea desde el Analizador de Consultas o desde nuestras aplicaciones. Hasta ahora, hemos usado un cierto nmero de procedimientos almacenados, como ser sp_help o sp_helpdb. Estos procedimientos se almacenan en la base de datos Master, y contienen comandos T-SQL que nos hacen la vida ms fcil en el momento de acceder a propiedades y objetos en la base de datos.

CATEGORAS DE PROCEDIMIENTOS ALMACENADOS Tenemos cinco clases de Procedimientos Almacenados: Procedimientos Almacenados del Sistema. Procedimientos Almacenados Locales. Procedimientos Almacenados Temporales. Procedimientos Almacenados Extendidos. Procedimientos Almacenados Remotos.

Procedimientos Almacenados del Sistema Los procedimientos almacenados del Sistema estn almacenados en la base de datos Master, y tpicamente tienen un nombre que empieza con el prefijo sp_. Realizan una amplia variedad de tareas para soportar funciones de SQL Server (como ser procedimientos de catlogo), que soportan llamados para obtener datos de las tablas de sistema, procedimientos generales para la administracin de bases de datos, y funciones para el manejo de la seguridad. Por ejemplo, podemos ver los privilegios de una tabla usando el procedimiento almacenado sp_table_privileges. El siguiente script usa el procedimiento almacenado sp_table_privileges para mostrar privilegios en la tabla Stores en la base de datos Pubs: USE Pubs GO EXECUTE sp_table_privileges Stores Una tarea administrativa muy comn es ver informacin sobre los usuarios que se encuentran logueados en la base de datos actualmente y los procesos asociados. Este paso es muy importante. El siguiente script usa el procedimiento almacenado del sistema sp_who para mostrar todos los procesos en uso por el usuario LAB1\Administrador: EXECUTE sp_who @loginame='LAB1\Administrador'
FAGDUT 2 CCI

Curso SQL Server 2000 Captulo 3

Procedimientos almacenados Locales Los Procedimientos Almacenados Locales son usualmente almacenados en una base de datos de usuario y se encuentran tpicamente diseados para completar tareas en donde residen. Un procedimiento almacenado local podra crearse para customizar el cdigo de un procedimiento almacenados de sistema. Para crear una tarea especfica basndose en un procedimiento almacenado, primero copiamos el contenido del mismo y guardamos el nuevo procedimiento almacenado como un procedimiento almacenado local. Procedimientos almacenados Temporales Un procedimiento almacenado temporal es similar a un procedimiento almacenado local, pero slo existe hasta que la conexin que lo cre es cerrada o el servicio SQL Server es apagado. El procedimiento almacenado es eliminado dependiendo del tipo de procedimiento creado. Esta volatilidad existe porque los procedimientos almacenados temporales son creados en la base de datos Tempdb. Tempdb es re-generada cuando el servidor se inicia, por lo que los objetos en esta base de datos desaparecen en el momento de cerrar la conexin o el servicio. Los procedimientos almacenados temporales son tiles cuando accedemos a versiones previas de SQL Server que no soportan el uso de planes de ejecucin y si no queremos guardar la tarea porque la misma ser ejecutada con muchos diferentes valores de parmetros. Hay tres tipos de procedimientos almacenados temporales: Locales (tambin llamados privados). Globales. Creados directamente en Tempdb.

El nombre de un procedimiento almacenado local siempre comienza con #, y el de un procedimiento almacenado global con ##. El mbito de ejecucin de un procedimiento temporario local se encuentra limitado a la conexin que lo cre. Sin embargo, todos los usuarios que tengan acceso a la base de datos pueden ver el procedimiento almacenado en el Examinador de Objetos del Analizador de Consultas. Cuando la conexin que cre el procedimiento temporal es cerrada, el procedimiento es eliminado de Tempdb. Cualquier conexin a la base de datos puede ejecutar un procedimiento almacenado temporal global. Este tipo de procedmiento debe tener un nombre nico, ya que todas las conexiones pueden ejecutarlo y, como todo procedimiento almacenado temporal, es creado en Tempdb. Automticamente se le asigna permiso de ejecucin a la funcin Public, y ste no puede ser cambiado. Un procedimiento almacenado global es tan voltil como uno global. Este tipo de procedimiento es removido cuando la conexin usada para crear el procedimiento es cerrada y cuando todas las conexiones que actualmente usan el procedimiento son completadas. Los procedimientos almacenados temporarios creados directamente en Tempdb son diferentes de los locales y los globales de la siguiente manera: Se les puede configurar permisos. Pueden existir cuando se cierra la conexin que los cre. No son removidos sino hasta que se cierra el servidor SQL Server.

Ya que este tipo de procedimiento es creado directamente en Tempdb, es importante calificar completamente los objetos de base de datos referenciados por los comandos T-SQL del procedimiento. Por ejemplo, si debemos referenciar a la tabla Authors, de la cual es propietario dbo, como pubs.dbo.Authors.

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

Procedimientos almacenados Extendidos Un procedimiento almacenado extendido usa un programa externo, compilado como una DLL de 32 bits y programado generalmente en lenguaje C, para expandir las capacidades de un procedimiento almacenado comn. Un nmero de procedimientos almacenados son extendidos. Por ejemplo, el procedimiento xp_sendmail, que enva un mensaje y el resultado de una consulta como adjunto a un recipiente e-mail, es tanto un procedimiento almacenado de sistema como un procedimiento almacenado extendido. La mayor parte de los procedimientos almacenados extendidos usan como convencin el prefijo xp_. Sin embargo, hay algunos procedimientos almacenados extendidos que usan el prefijo sp_, y algunos procedimientos comunes usan el prefijo xp_. Por lo tanto, no debemos depender de las convenciones de nombre para identificar procedimientos almacenados, tanto extendidos como comunes. Usaremos la funcin OBJECTPROPERTY para determinar si un procedimiento almacenado es extendido o no. Esta funcin retorna el valor de 1 para IsExtendedProc, indicando un procedimiento almacenado extendido, o retorna un valor 0 indicando que el procedimiento no es extendido. El siguiente ejemplo demuestra que el procedimiento almacenado sp_prepare es un procedimiento almacenado extendido y que sp_logininfo no lo es:

USE Master SELECT OBJECTPROPERTY(object_id('sp_prepare'), 'IsExtendedProc') Este script retorna el valor 1. USE Master SELECT OBJECTPROPERTY(object_id('xp_logininfo'), 'IsExtendedProc') Este script retorna el valor 0. Procedimientos almacenados remotos Como su nombre indica, un procedimientos almacenado remoto ejecuta un procedimiento almacenado en una instalacin de SQL Server remota. Los procedimientos almacenados remotos permanecen por compatibilidad hacia atrs, y han sido reemplazados por las consultas distribudas.

PRCTICA 5.1 EXPLORANDO PROCEDIMIENTOS ALMACENADOS Para ver procedimientos almacenados del sistema En este ejercicio, exploraremos algunos procedimientos almacenados registrados en la base de datos Master. 1. Abrimos el Analizador de Consultas y nos conectamos al servidor SQL Server local. 2. Abrimos el Examinador de Objetos si no se encuentra ya abierto. El examinador de objetos nos muestra una jerarqua de objetos dentro de nuestro servidor. 3. Expandimos el nodo Master. Una lista de objetos aparece; notemos los nodos Procedimientos Almacenados y Procedimientos Almacenados Extendidos. 4. Expandimos el nodo Procedimientos almacenados. Aparece una lista de Procedimientos almacenados y Procedimientos almacenados extendidos residentes en la base de datos Master. 5. Revisaremos los nombres de los procedimientos. Ntese que todos tienen como propietario a dbo. 6. Expandiremos el nodo correspondiente al procedimiento sp_who. Se muestran los nodos Parmetros y Dependencias.

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

7. Expandiremos en nodo Parmetros. Notemos que hay dos parmetros definidos para este procedimiento: @RETURN_VALUE y @loginname. @RETURN_VALUE es un parmetro incorporado a todos los procedimientos almacenados, y se utiliza para retornar valores del mismo al llamador. Todos los procedimientos almacenados contienen un parmetro @RETURN_VALUE. @loginname es un parmetro de entrada. 8. Expandimos el nodo Dependencias. Notemos que hay slo una dependencia para este procedimiento almacenado: la tabla dbo.sysprocesses. Esta es una tabla del sistema almacenada en la base de datos Master. El procedimiento sp_who accede a esta tabla en tiempo de ejecucin y muestra partes de la misma en su resultado. 9. Cerramos el nodo sp_who y cerramos el Analizador de Consultas. Para ver el contenido de un procedimiento almacenado 1. Hacemos click en el objetos sp_who. 2. Hacemos click derecho en sp_who, y seleccionamos Opciones de secuencia de comandos. 3. Asegurmonos de que la opcin Incluir Encabezados descriptivos se encuentre seleccionada. 4. Nuevamente, hacemos click derecho sobre sp_who, y seleccionaremos Crear secuencia de comandos en una nueva ventana, y Create. 5. En la barra de herramientas, hacemos click en Nueva consulta, o tipearemos Ctrl+N. Se abrir una nueva ventana en el Analizador de Consultas. 6. En el panel de edicin, escribimos la siguiente sentencia T-SQL: sp_helptext [master.dbo.sp_who] Este cdigo usa el procedimiento almacenado del sistema sp_helptext para mostrar el contenido del procedimiento almacenado sp_who contenido en la base de datos Master. No es estrictamente necesario calificar el nombre del procedimiento almacenado, pero es de buena prctica ya que garantiza que vamos a abrir el objeto que estamos interesados en abrir. 7. Ejecutamos esta lnea de cdigo y veremos los resultados. 5.2 ADMINISTRACIN DE PROCEDIMIENTOS ALMACENADOS En este apartado, aprenderemos un nmero de mtodos para administrar procedimientos almacenados. Los procedimientos almacenados son comunmente creados, ejecutados o eliminados usando el Analizador de Consultas o el Administrador Corporativo. Los procedimientos almacenados pueden ser creados antes que los objetos que referencian. Esta caracterstica se llama resolucin de nombre diferida. La sentencia para crear procedimientos almacenados es CREATE PROCEDURE. Antes de ejecutar un procedimiento almacenado, debemos proporcionar los parmetros requeridos. Los procedimientos almacenados pueden ejecutarse manualmente o automticamente cuando SQL Server se inicia. La palabra clave para ejecutar un procedimiento almacenado es EXECUTE. Este comando es opcional si el procedimiento almacenado se ejecutar en una sla lnea de cdigo o si es la primera palabra clave en un lote. Modificar un procedimiento almacenado luego de ser creado es prctica comn; quizs necesitemos agregar un parmetro o cambiar algo en el cdigo del procedimiento. Modificar un procedimiento en lugar de eliminarlo y volverlo a crear nos ahorra tiempo, ya que las propiedades de los mismos son retenidas (as como sus permisos asociados). La sentencia para modificar procedimientos almacenados es ALTER PROCEDURE. Los procedimientos almacenados son eliminados de la base de datos con la sentencia DROP PROCEDURE. Podemos eliminar un procedimiento almacenado tambin desde el Administrador Corporativo o el Analizador de Consultas seleccionando el mismo y pulsando la
FAGDUT 5 CCI

Curso SQL Server 2000 Captulo 3

tecla <Delete>. Un procedimiento almacenado no debera ser eliminado hasta que los restantes objetos que dependen del mismo hayan sido eliminados o modificados (para romper la dependencia). Cmo se guarda un Procedimiento Almacenado Cuando se crea un procedimiento, SQL Server controla la sintaxis de las sentencias TSQL. Si la sintaxis no es correcta, SQL Server genera un mensaje de error con la leyenda Sintaxis Incorrecta, y el procedimiento no es creado. Si el texto del procedimiento pasa el control de sintaxis, el procedimiento es guardado escribiendo el nombre del mismo y otra informacin en la tabla SysObjects. El texto mismo del procedimiento es guardado en la tabla SysComments de la base de datos actual. Las siguientes consultas SQL consultan la tabla sysobjects en la base de datos Pubs para mostrar el nmero de identificacin del procedimiento almacenado ByRoyalty.: SELECT [name], [id] FROM [pubs].[dbo].[SysObjects] WHERE [name] = 'byroyalty' Esta consulta retorna lo siguiente:

name id ----------------------byroyalty 581577110 Usando la informacin retornada por la tabla sysobjects, el prximo SELECT consulta la tabla syscomments usando el nmero de id de la consulta anterior:

SELECT [text] FROM [pubs].[dbo].[SysComments] WHERE [id] = 581577110 Esta consulta retorna el texto del procedimiento almacenado byroyalty, cuyo nmero de identificacin es 581577110. Usar el procedimiento almacenado del sistema sp_helptext es una mejor opcin para mostrar el texto utilizado para crear un objetos (como ser un procedimiento no encriptado), ya que el texto es retornado en mltiples filas.

MTODOS PARA CREAR PROCEDIMIENTOS ALMACENADOS SQL Server proporciona varios mtodos que podemos usar para crear procedimientos almacenados: El Asistente de Creacin de procedimientos almacenados en el Administrador Corporativo. El Administrador Corporativo. La sentencia CREATE PROCEDURE de Transact-SQL.

El Asistente de creacin de procedimientos almacenados Para dar de alta a un procedimientos almacenado desde el asistente, hacemos click en el men principal Herramientas, Asistentes y seleccionamos Asistente para creacin de procedimientos almacenados. Se nos mostrar la siguiente figura:

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

Hacemos click en Aceptar y Siguiente. Se nos mostrar una ventana donde deberemos seleccionar la base de datos a utilizar para registrar nuestro procedimiento:

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

En la siguiente ventana, debemos seleccionar el tipo de operacin que realizar nuestro procedimiento almacenado. En nuestro caso, seleccionaremos para la tabla Autores, las opciones de Insertar, Eliminar y Actualizar. Hacemos click en Siguiente y Finalizar. Se crearn tres procedimientos almacenados. Si vemos el cdigo generado en el nodo de Procedimientos Almacenados, podemos ver que se agregaron tres procedimientos, uno para insertar datos en la tabla Autores, otro para eliminar, y otro para actualizar los datos. Utilizar el Administrador Corporativo Podemos crear un procedimiento almacenado directamente con el Administrador Corporativo. Para realizar esta tarea, expandiremos el rbol de consola para nuestro servidor, y expandiremos el nodo de la base de datos donde se crear el procedimiento almacenado. Finalmente, hacemos click derecho en el nodo Procedimientos Almacenados y seleccionamos Nuevo procedimiento almacenado. La siguiente figura nos muestra la ventana donde ingresaremos nuestro procedimiento:

Podemos revisar la sintaxis del nuevo procedimiento almacenado antes de crearlo y tambin guardar una plantilla que aparecer siempre que creemos un nuevo procedimiento usando el Administrador Corporativo. Una vez creado el procedimiento almacenado, podemos abrir las propiedades del mismo y configurarle permisos. Por defecto, los propietarios de los procedimientos almacenados y los pertenecientes a sysadmin tienen todos los permisos sobre el procedimiento almacenado. Las plantillas son tiles ya que proporcionan un marco para crear documentacin consistente para procedimientos almacenados. Tpicamente, se agrega texto en el encabezado que describe cmo debera ser documentado cada procedimiento almacenado. La sentencia CREATE PROCEDURE Podemos usar la sentencia T-SQL CREATE PROCEDURE (o la versin recortada CREATE PROC) para crear un procedimiento almacenado en el Analizador de Consultas o desde una ventana de comandos como osql. Cuando usamos CREATE PROCEDURE, podemos realizar las siguientes tareas:
FAGDUT 8 CCI

Curso SQL Server 2000 Captulo 3

Agrupar procedimientos almacenados. Definir parmetros de entrada y salida, as como sus tipos de datos y sus valores por defecto. Cuando se definen parmetros de entrada y de salida, siempre son precedidos por el signo @, seguido del nombre del parmetro y su tipo de datos. Los parmetros de salida deben incluir la palabra clave OUTPUT para distinguirlos de los de entrada.

Usar cdigos de retorno para mostrar informacin sobre el suceso o fallo de una tarea. Controlar si el plan de ejecucin ser guardado en cach para el procedimiento. Encriptar el procedimiento almacenado para seguridad. Especificar las acciones que el procedimiento realizar cuando fuere ejecutado.

Ejecucin de un Procedimiento almacenado Como hemos visto ms arriba, podemos ejecutar un procedimiento almacenado en el Analizador de Consultas simplemente tipeando su nombre y los parmetros de entrada y salida requeridos. Por ejemplo, observamos los contenidos de un procedimiento almacenado usando el procedimiento sp_helptext y como parmetro el nombre del procedimiento almacenado a ver Si el procedimiento almacenado no es la primera sentencia en un lote, debemos preceder su nombre con la palabra clave EXECUTE para ejecutarlo. Especificando parmetros y sus valores Si un procedimiento almacenado requiere valores para sus parmetros, deberemos especificarlos cuando lo ejecutemos. Cuando se definen parmetros de entrada y salida, los mismos son precedidos por el signo @ seguido del nombre del parmetro y su tipo de datos. El siguiente ejemplo ejecuta el procedimiento almacenado au_info en la base de datos Pubs con dos parmetros: @lastname y @firstname. --call the stored procedure with the parameter values. USE Pubs GO EXECUTE au_info Green, Marjorie --Llamanos al procedimiento almacenado --con nombres y valores de parmetros USE Pubs GO EXECU TE au_info @lastname = 'Green', @firstname = 'Marjorie' En el primer ejemplo, los valores de parmetros son especificados, pero los nombre de los mismos no. Si los valores son especificados sin sus correspondientes nombre, deben ser ingresados en el orden correcto para que SQL Server no genere un mensaje de error. En el segundo ejemplo, los nombres de parmetros son especificados y sus valores tambin. En este caso, los parmetros pueden ser ingresados en cualquier orden. Los parmetros que poseen valores por defecto, pueden ser omitidos y el procedimiento tomar dicho valor en el momento de su ejecucin.

FAGDUT

CCI

Curso SQL Server 2000 Captulo 3

Modificando Procedimientos almacenados Podemos usar la sentencia ALTER PROCEDURE para modificar los contenidos de un procedimiento almacenado definido por el usuario usando el Analizador de Consultas o alguna utilidad de lnea de comando como ser osql. La sintaxis de ALTER PROCEDURE es casi la misma que la de CREATE PROCEDURE. La ventaja de utilizar ALTER PROCEDURE antes que eliminar el procedimiento y volver a crearlo est en que ALTER PROCEDURE retiene la mayora de las propiedades del procedimiento, como ser su ID de objeto, los permisos asociados al procedimiento, etc. Para mantener la configuracin de encriptacin y compilacin usaremos las palabras clave WITH ENCRYPTION y WITH RECOMPILE al ejecutar la sentencia de creacin. Podemos usar tanto el Administrador Corporativo como el Analizado de Consultas para alterar un procedimiento almacenado. En el primero, hacemos click derecho sobre un procedimiento almacenado, y seleccionaremos Propiedades. El la ventana de Propiedades del procedimiento almacenado, modificamos el mismo y lo volvemos a generar. Desde el Analizador de Consultas, seleccionaremos el procedimiento almacenado desde el Examinador de objetos, hacemos click derecho sobre el mismo, y seleccionamos Crear secuencia de comandos del objeto, y Alter. Para modificar el nombre de un procedimiento almacenado, usaremos el procedimiento de sistema sp_rename. El siguiente script renombre el procedimiento ByRoyalty de la base de datos Pubs a RoyaltyByAuthorID: USE PUBS GO EXECUTE sp_rename @objname = 'byroyalty', @newname = 'RoyaltyByAuthorID', @objtype = 'object' Los procedimientos almacenados del usuario pueden ser renombrados tambin mediante el Administrador Corporativo haciendo click derecho en el procedimiento almacenado y click en Cambiar nombre. Nota: Debemos tener sumo cuidado al renombrar procedimientos almacenados u otros objetos (como ser tablas). Los procedimientos almacenados pueden ser anidados. Si se llama a un objetos renombrado, el procedimiento original sera incapaz de ubicar el objeto. Eliminando Procedimientos almacenados Podemos usar la sentencia DROP PROCEDURE para eliminar un procedimiento almacenado de usuario, varios procedimientos a la vez, o un grupo de procedimientos agrupados. El siguiente script elimina dos procedimientos de la base de datos Pubs: USE pubs GO DROP PROCEDURE procedure01, procedure02 Notemos en el ejemplo que Pubs es la base de datos actual. No podemos especificar el nombre de base de datos cuando especificamos cul procedimiento eliminar. El nombre completo calificado es [propietario].[nombre_de_procedimiento].

FAGDUT

10

CCI

Curso SQL Server 2000 Captulo 3

PRCTICA 5.2 ADMINISTRACIN DE PROCEDIMIENTOS ALMACENADOS En esta prctica, crearemos un nuevo procedimiento almacenado en la base de datos Northwind y verificaremos que fuera creado. En las restantes prcticas de este mdulo, ejecutaremos, modificaremos y eliminaremos dicho procedimiento. Crear un procedimiento almacenado en la base de datos Northwind 1. Abrimos el Analizador de Consultas de SQL Server. 2. Cerramos el Examinador de Objetos si estuviera abierto. 3. En el panel del editor, tipearemos el siguiente script: USE northwind GO CREATE PROCEDURE dbo.CustOrderHistRep @CustomerID char(5) AS SELECT ContactName, ContactTitle FROM Customers WHERE CustomerID = @CustomerID SELECT ProductName, Total=SUM(Quantity) FROM Products P, [Order Details] OD, Orders O, Customers C WHERE C.CustomerID = @CustomerID AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID GROUP BY ProductName GO La base de datos Northwind es la base de datos seleccionada por el primer lote. Luego, un procedimiento llamado CursOrderHistRep es creado y se le asigna un solo parmetro de entrada. 4. Revisaremos las sentencias SELECT que conforman el procedimiento almacenado. Cuando se ejecuta la consulta, el primer SELECT muestra el nombre de una persona y el ttulo para el ID de cliente ingresado. El segundo SELECT muestra todos los nombres de producto adquiridos por el cliente y la cantidad total de cada producto. El resultado retorna los datos agrupados por nombre de producto. Podramos notar que se realizan mltiples joins dentro del WHERE, en lugar de dentro del FROM. Un paso adicional podra ser pasar las condiciones de los JOINs al FROM. Para ver el procedimiento almacenado en el Analizador de Consultas 1. Abrimos el Explorador de Objetos en el Analizador de Consultas. 2. Expandimos el nodo Procedimientos Almacenados. Aparecern todos los procedimientos almacenados registrados en la base de datos actual. 3. Expandimos dbo.CustOrderHistRep. Aparecern dos nodos adicionales: Parmetros y Dependencias. 4. Expandimos Parmetros. Notemos que hay dos parmetros para el procedimiento: CustomerID y el parmetro de retorno RETURN_VALUE. 5. A continuacin, expandiremos el nodo Dependencias. Notemos que el procedimiento almacenado depende de cuatro objetos: dbo.orders, dbo.products, dbo.Order Details, y dbo.Customers. 6. Pasemos al editor del Analizador de Consultas. Tipearemos lo siguiente: sp_depends CustOrderHistRep 7. Finalmente, ejecutaremos el procedimiento almacenado: EXEC CustOrderHistRep 'ALFKI'

FAGDUT

11

CCI

Curso SQL Server 2000 Captulo 3

Para eliminar el procedimiento almacenado 1. Tipearemos lo siguiente en el Analizador de Consultas: DROP PROCEDURE dbo.custorderhistrep El procedimiento almacenado es eliminado de la base de datos Northwind. 2. Usaremos el Examinador de Objetos y el Administrador Corporativo para asegurarnos que efectivamente se elimin el objeto. 3. Cerramos el Analizador de Consultas y finalizamos.

5.3 TRIGGERS INTRODUCCIN La implementacin del control de integridad de nuestros datos es crtica para mantener la consistencia de la base de datos. Los mtodos complejos de control de integridad pueden ser agregados a nuestra base de datos usando Triggers. Los triggers son un tipo especial de Procedimiento Almacenado que se aplica a las tablas y vistas. Los eventos de modificacin de datos provocan la corrida de los triggers automticamente. En este apartado veremos los distintos tipos de triggers que tenemos a nuestra disposicin, a la vez que observaremos sus capacidades y limitaciones. Extendiendo la Integridad de nuestros datos con Triggers La calidad de nuestra base de datos se mide parcialmente por la consistencia y coherencia de los datos en la misma. La integridad de datos declarativa y procedural pueden ser utilizadas para mantener la consistencia y coherencia de los datos. Los Triggers nos permiten escribir un procedimiento que es invocado cuando los datos de una tabla son modificados con una accin de INSERT, UPDATE, o DELETE. Un trigger es aplicado a una tabla o vista. Los Triggers son usados para implementar reglas de lgica de negocio en nuestra base de datos. Capacidades y limitaciones de los Triggers La opcin de Integridad Referencial en Cascada extiende la correccin y consistencia de nuestros datos aplicando actualizaciones o eliminaciones a las claves forneas dentro de la base de datos. Los Triggers van ms all extendiendo la integridad de los datos hacia cualquier columna de cualquier tabla o an a objetos fuera de la base de datos actual. Asimismo, podemos aplicar Triggers a las vistas. Un simple trigger puede ejecutar mltiples acciones, y puede ser lanzado por ms de un evento. Por ejemplo, podemos crear un solo trigger que corra cuando una operacin de INSERT, UPDATE o DELETE ocurra. Dentro del cdigo Transact-SQL, podemos definir lgica de negocio para manejar los distintos eventos. Los triggers no pueden ser creados en tablas temporarias o tablas del sistema, aunque el lenguaje Transact-SQL dentro de un trigger puede referencial tablas temporarias o de sistema. Una importante limitacin a tener en cuenta es que los triggers del tipo INSTEAD OF DELETE y INSTEAD OF UPDATE no pueden ser definidos en tablas que no tengan su correspondiente ON DELETE o ON UPDATE integridad referencial definida.

FAGDUT

12

CCI

Curso SQL Server 2000 Captulo 3

Eventos de Triggers Tres eventos automticamente disparan un trigger: INSERT, UPDATE y DELETE; estos eventos ocurren en una tabla o vista. Los triggers no pueden ser ejecutados manualmente. La sintaxis de un trigger siempre incluye la definicin de uno o ms de estos eventos antes de su definicin. El lenguaje T-SQL es especificado. Los tipos de triggers corresponden a su evento. Por ejemplo, podemos crear un trigger del tipo update para que cuando una actualizacin ocurra en la tabla, este sea lanzado. Un solo trigger puede ser asignado a mltiples eventos, por lo que podramos tener un procedimiento que responda tanto a las actualizaciones como a las inserciones. Estos eventos pueden ser listados en cualquier orden dentro de la definicin del trigger. Hay ciertas instancias cuando un evento que modifica o elimina datos no ejecuta el trigger correspondiente. Por ejemplo, la sentencia TRUNCATE TABLE no dispara los triggers definidos para DELETE. Una caracterstica importante de los triggers es que las transacciones que no se completen satisfactoriamente son vueltas atrs (ROLLBACK). Como TRUNCATE TABLE no es un evento cuya ocurrencia se registre en el registro de transacciones, no puede ser vuelta atrs por lo que no dispara el trigger de DELETE. Adicionalmente, los comandos WRITETEXT no disparan los triggers de INSERT y DELETE. Ejecucin de un Trigger Cuando una insercin en una tabla dispara un trigger, el mismo guarda los datos nuevos o modificados en una tabla llamada Inserted. Cuando una eliminacin en una tabla dispara un trigger, el mismo guarda los datos eliminados en una tabla llamada Deleted. La tabla existe en memoria y es consultada dentro del trigger utilizando sentencias T-SQL. Esta capacidad es crtica a la funcin de los triggers, y por ejemplo, al modificar los datos de una tabla, el trigger puede comparar los datos contenidos en las tablas Inserted y Deleted con los nuevos datos en la tabla principal antes de confirmar los cambios. Usando la informacin de las tablas Inserted y Deleted, un trigger puede volver atrs una transaccin para reforzar las reglas de negocio. Hay dos tipos de triggers en SQL Server 2000: INSTEAD OF. AFTER o FOR.

Los triggers del tipo INSTEAD OF puentean la accin disparadora y se ejecutan en lugar de la misma. Por ejemplo, un UPDATE sobre una tabla conteniendo un trigger del tipo INSTEAD OF ejecutar el cdigo T-SQL en lugar de la sentencia misma. Esta caracterstica nos permite especificar procesamiento complejo dentro de un trigger. Los triggers del tipo AFTER se ejecutan como un suplemento de la accin disparadora y son los triggers por defecto. Un trigger slo puede ser aplicado a una tabla o vista. La siguiente tabla nos muestra las principales diferencias entre los dos tipos de triggers: Caracterstica Aplicado a INSTEAD OF Definido sobre una tabla o vista. Al definirlo sobre una vista, extiende las posibilidades de actualizacin de la misma. AFTER Definido sobre una tabla solamente. Modificaciones a las vistas relacionadas causan la ejecucin de un trigger AFTER en las tablas subyacentes. Ms de uno permitidos para las tablas.

Cantidad Permitida

Slo uno por tabla o vista. Podemos definir vistas a partir de otras vistas con su propio trigger asociado.

FAGDUT

13

CCI

Curso SQL Server 2000 Captulo 3

Orden de ejecucin

Slo un trigger por tabla o vista.

Usaremos el proc. almac. Sp_settriggerorder para definir el orden de ejecucin de los triggers.

Podemos aplicar los dos tipos de trigger a una tabla. Si hemos definido ambos tipos de triggers y restricciones para una tabla, el trigger INSTEAD OF se ejecuta. A continuacin, las restricciones son procesadas y finalmente se ejecutan los triggers AFTER. Si las restricciones son violadas, las acciones INSTEAD OF son vueltas atrs (ROLLBACK). Los triggers AFTER no se ejecutan si las restricciones son violadas o si algn otro evento causa una falla en los datos de la tabla en cuestin. Como los procedimientos almacenados, los triggers pueden ser anidados en hasta 32 niveles y pueden ser ejecutados en forma recursiva.

CREACIN Y ADMINISTRACIN DE TRIGGERS Creacin de Triggers usando Transact-SQL Podemos usar la sentencia CREATE TRIGGER para crear un trigger usando el Analizador de Consultas o una utilidad de lnea de comandos como ser osql. Cuando usamos CREATE TRIGGER, debemos especificar el nombre del trigger, la tabla o vista sobre la cual es aplicado, la clase del trigger (INSTEAD OF o AFTER), el o los eventos que disparan el trigger, y la tarea que deseamos que realice el trigger. La sintaxis de CREATE TRIGGER puede ser sumarizada como sigue: CREATE TABLE nombre_trigger ON nombre_table o nombre_vista FOR clase_trigger y tipo(s)_trigger AS sentencias Transact-SQL La creacin de un trigger comienza con CREATE TRIGGER seguido del nombre del mismo. Los triggers no permiten especificar el nombre de la base de datos seleccionada como parte de su nombre de objeto, por lo que deberemos tener seleccionada la misma con un USE y un GO antes de la declaracin del trigger. El GO tiene que ir debido a que CREATE TRIGGER debe ser la primera sentencia en el lote. Los permisos para crear trigger son por defecto del propietario de la tabla. Por consistencia, consideraremos crear tablas, trigger, y otros objetos de base de datos de tal forma que dbo sea el propietario. La clusula ON Los triggers deben ser asignados a una tabla o vista. Usaremos la clusula ON para informar al trigger en qu tabla o vista debe ser aplicado. Cuando un trigger es aplicado, la tabla o vista es referenciada como la tabla o vista del trigger. Por consistencia, especificaremos el propietario de la tabla o vista luego de la clusula ON. Por ejemplo, aplicar un trigger llamado Alerta a una tabla Empleados, tendramos el siguiente script: CREATE TRIGGER dbo.alerta ON dbo.Empleados Un trigger es aplicado slo a una tabla o vista. Si necesitamos aplicar la misma tarea del trigger a otra tabla en la base de datos, crearemos un trigger con diferente nombre que contenga la misma lgica de negocio. Entonces, aplicaremos el nuevo trigger a la otra tabla. El tipo AFTER slo puede aplicarse a una tabla, mientras que el tipo INSTEAD OF puede aplicarse tanto a tablas como a vistas.

FAGDUT

14

CCI

Curso SQL Server 2000 Captulo 3

Las clusulas FOR, AFTER e INSTEAD OF Debemos especificar en la definicin de nuestro trigger el tipo de evento. Los tipos de eventos vlidos son INSERT, UPDATE y DELETE. Un trigger puede ser ejecutado porque uno, dos, o los tres eventos ocurren. Si deseamos que un trigger se dispare en todos los eventos, seguiremos las clusulas FOR, AFTER o INSTEAD OF con INSERT, UPDATE y DELETE. Por ejemplo, para crear un trigger llamado Alerta que se dispare cuando ocurren todos los eventos, podemos usar el siguiente script: CREATE TRIGGER dbo.alerta ON dbo.empleados FOR INSERT, UPDATE, DELETE La clusula FOR es sinnimo de AFTER. Por lo tanto, el ejemplo de cdigo previo crea un trigger de tipo AFTER. Para crear a Alerta como un trigger del tipo INSTEAD OF, podemos usar el siguiente script: CREATE TRIGGER dbo.alerta ON dbo.empleados INSTEAD OF INSERT, UPDATE, DELETE La clusula AS La clusula AS en T-SQL especifica la tarea que el trigger debe realizar. El siguiente ejemplo muestra la creacin del trigger Alerta que enva un email a un usuario llamado Horacio cuando un INSERT, UPDATE o DELETE ocurre en la tabla Empleados: USE CURSOSQL GO CREATE TRIGGER dbo.Alerta ON dbo.Empleados AFTER INSERT, UPDATE, DELETE AS EXEC master..xp_sendmail 'BarryT', 'Un registro fue insertado, actualizado o eliminado de la tabla GO Creacin de un Trigger usando el Administrador Corporativo Podemos crear trigger usando la interfase de SQL-DMO o usando aplicaciones como ser el Administrador Corporativo. Para crear un trigger en el Administrador Corporativo, primero debemos seleccionar la base de datos. A continuacin, hacemos click derecho en la tabla o vista sobre la cual se aplicar nuestro trigger, click en Todas las Tareas, y click en Administrar desencadenadores (triggers). En la caja de dilogo que aparece, ingresaremos la definicin del trigger. Ver figura a continuacin:

FAGDUT

15

CCI

Curso SQL Server 2000 Captulo 3

Administracin de Triggers Los triggers son poderosos objetos de base de datos que se ejecutan automticamente cuando una tabla o vista es modificada. Existe un gran nmero de herrramientas de base de datos para administrar trigger. Los triggers pueden: Ser modificados usando ALTER TRIGGER. Renombrados usando el procedimiento almacenado sp_rename. Ser visto su contenido usando los procedimientos almacenados sp_helptrigger y sp_helptext. Eliminados usando DROP TRIGGER. Deshabilitados o habilitados usando DISABLE TRIGGER y ENABLED TRIGGER en la sentencia ALTER TABLE.

Tambin podemos usar la opcin Administrar desencadenadores del Administrador Corporativo para modificar, ver y eliminar triggers. Modificando y renombrando Triggers Para modificar el texto de un trigger, podemos eliminarlo y volverlo a crear. Alternativamente, para evitarnos el paso del borrado, podemos usar la sentencia ALTER TRIGGER. La sentencia ALTER TRIGGER es similar a CREATE TRIGGER, pero ALTER TRIGGER no remueve el trigger de las tablas syscomments y sysobjects. El siguiente script nos muestra cmo modificar nuestro trigger Alerta para que slo reporte actualizaciones de la tabla Empleados ALTER TRIGGER dbo.alerta ON dbo.empleados AFTER UPDATE AS EXEC master..xp_sendmail 'BarryT', 'Se actualiz un registro en la tabla empleados.' GO

FAGDUT

16

CCI

Curso SQL Server 2000 Captulo 3

Hay veces en que necesitamos renombrar un trigger para cumplir con nuevas convenciones de nombre, o porque estamos implementando ms de un trigger en una tabla. Podemos renombrar un trigger usando el procedimiento almacenado sp_rename. El siguiente ejemplo nos muestra cmo renombrar el trigger Alerta a AlertaEmp: sp_rename @objname = alerta, @newname = alertaemp Notemos que dbo no fue especificado en la sintaxis del sp_rename. La propiedad de un trigger no puede ser transferida usando sp_rename. Si necesitamos cambiar el propietario de un procedimiento almacenado, debemos usar CREATE TRIGGER. Si estuviramos anidando el trigger a renombrar, deberemos asegurarnos que el trigger llamador llame al nuevo nombre. Ver, Eliminar y Deshabilitar Triggers Cuando se crea un procedimiento almacenado, su nombre y otra informacin de identificacin es guardada en la tabla del sistema sysobjects. El texto del trigger es almacenado en syscomments. El siguiente SELECT nos muestra todos los triggers aplicados a tablas en la base de datos CURSOSQL: SELECT * FROM CURSOSQL..SysObjects WHERE type = 'tr' El tipo de columna para listar triggers debe ser tr. Usaremos el procedimiento almacenado del sistema sp_helptrigger para mostrar las propiedades de un trigger. Por ejemplo, para mostrar las propiedades de todos los triggers definidos para la tabla Empleados, tipearemos lo siguiente: sp_helptrigger @tabname = Empleados Al eliminar un trigger se lo remueve de las tablas syscomments y sysobjects. Usaremos la sentencia DROP TRIGGER para eliminar uno o ms triggers de una base de datos. Si eliminamos una tabla o vista, los trigger asociados con la misma tambin son eliminados. Por ejemplo, para eliminar el trigger Alerta en la base de datos CURSOSQL, tipearemos lo siguiente: USE CURSOSQL DROP TRIGGER [dbo].[alerta] Como ocurre con CREATE TRIGGER, no podemos especificar el nombre de la base de datos el DROP TRIGGER. En cambio, DROP TRIGGER no tiene que estar necesariamente en primer lugar en el lote a ejecutar, por lo que no insertamos los GO en nuestro ejemplo. Para deshabilitar un trigger, usamos la sentencia ALTER TABLE de la siguiente forma: ALTER TABLE Empleados DISABLE TRIGGER alerta Para deshabilitar todos los triggers de una tabla, usamos la opcin ALL de la clusula DISABLE TRIGGER. Para habilitar un trigger, cambiaremos DISABLE por ENABLE.

FAGDUT

17

CCI

Curso SQL Server 2000 Captulo 3

PRCTICA 5.3 ADMINISTRACION DE TRIGGERS En este ejercicio, crearemos y testearemos un trigger que muestra un mensaje indicando que se ejecut el mismo. Entonces le cambiaremos el nombre, modificaremos su contenido, visualizaremos, deshabilitaremos y lo eliminaremos de la base de datos finalmente. Para crear triggers en la tabla Autores de la base de datos CURSOSQL 1. Abrimos el Analizador de Consultas. 2. En el panel de edicin, tipearemos la siguiente definicin de un trigger: USE CURSORSQL GO CREATE TRIGGER dbo.insertindicator ON dbo.autores AFTER INSERT AS PRINT Se dispar el trigger de INSERCIN. 3. A continuacin, crearemos trigger para la actualizacin y eliminacin de registros en la tabla Autores: CREATE TRIGGER dbo.updateindicator ON dbo.authors AFTER UPDATE AS PRINT 'Se dispar el trigger de actualizacin.' GO CREATE TRIGGER dbo.deleteindicator ON dbo.authors AFTER DELETE AS IF @@ROWCOUNT <> 0 PRINT 'Se dispar el trigger de eliminacin.' Las sentencias CREATE TRIGGER crean trigger llamados UpdateIndicator y DeleteIndicator. Estos triggers son aplicados a la tabla Autores en la base de datos CURSOSQL. Cuando ocurre tanto un UPDATE como un DELETE, estos triggers imprimen un mensaje en la grilla de resultados. Notemos que en el ltimo trigger se testea el valor de la variable del sistema @@ROWCOUNT. Si uno o ms registros son eliminados, se muestra el mensaje. Para testear los triggers de la tabla Autores 1. En el panel de cdigo del Analizador de Consultas, tipearemos lo siguiente: INSERT INTO AUTORES ( IDAutor, Apellido, Nombre, AnioNac, AnioMuerte, Descripcin ) VALUES ( 1, Perez, Juan, 1973. N/A, ) Se genera un nuevo registro en la tabla Autores y se dispara el trigger InsertIndicator. 2. De nuevo en el panel de cdigo, ingresaremos la siguiente sentencia UPDATE: UPDATE AUTORES SET Apellido = Rodriguez WHERE IDAutor = 1 Se actualiza el registro correspondiente en la tabla Autores y se dispara el trigger UpdateIndicator.
FAGDUT 18 CCI

Curso SQL Server 2000 Captulo 3

3. Finalmente, tipearemos lo siguiente: DELETE FROM AUTORES WHERE IDAutor = 1 Observaremos que se dispara el trigger DeleteIndicator. Para deshabilitar y eliminar un Tigger 1. En la ventana de cdigo del Analizador de Consultas, tipearemos la siguiente lnea: ALTER TABLE Autores DISABLE TRIGGER InsertIndicator Esta sentencia ALTER TABLE deshabilita el trigger InsertIndicator en la tabla Autores. 2. Si ahora ejecutamos una sentencia INSERT, veremos que no se dispara ningn trigger: INSERT INTO AUTORES ( IDAutor, Apellido, Nombre, AnioNac, AnioMuerte, Descripcin ) VALUES ( 2, Orozco, Pepe, 1955. N/A, ) 3. Finalmente, en el editor de cdigo ingresaremos las siguiente sentencias para eliminar los triggers: DROP TRIGGER InsertIndicator, UpdateIndicator, DeleteIndicator 4. Finalmente, cerramos el Analizador de Consultas y terminamos.

FAGDUT

19

CCI

Вам также может понравиться