You are on page 1of 26

Taller MS Server 7.

0 Lenguaje Transact Sql

TALLER
MS SQL SERVER 7
Lenguaje Transact SQL (Primera Parte)
( 2002)

Docentes:
Ing. Cintia Vernica Gioia. Leandro Ezequiel Diato.

UNIVERSIDAD NACIONAL DE LA MATANZA

Pgina 1

Taller MS Server 7.0 Lenguaje Transact Sql

PROGRAMACIN DE BASES DE DATOS EN SQL SERVER 7.0______3


INTEGRAR LAS DECISIONES DE NEGOCIO EN LA BASE DE DATOS .....................................................................................................3 OBTENER BUENOS RENDIMIENTOS .............................................................................................................................................4 QU ES UN PROCEDIMIENTO ALMACENADO ................................................................................................................................6 QU ES UN TRIGGER ..............................................................................................................................................................7 CREACIN DE PROCEDIMIENTOS ALMACENADOS ..........................................................................................................................8 La sentencia CREATE PROCEDURE: ........................................................................................................................8 Creacin de procedimientos almacenados mediante Enterprise Manager :.................................................................9 SENTENCIAS SQL DEL PROCEDIMIENTO ALMACENADO ................................................................................................................9 PROCEDIMIENTOS DE RECOMPILACIN FORZOSA:........................................................................................................................10 ELIMINACIN DE PROCEDIMIENTOS ALMACENADOS ....................................................................................................................10 PARMETROS ......................................................................................................................................................................11 EJECUCIN DE PROCEDIMIENTOS ALMACENADOS .......................................................................................................................11 Valor de estado (status value) :...................................................................................................................................13 Retorno de parmetros: .............................................................................................................................................14 TRIGGERS ..........................................................................................................................................................................16 Creacin de triggers: .................................................................................................................................................16 Acciones que desatan la ejecucin del trigger: ..........................................................................................................16 Sentencias SQL del trigger :.......................................................................................................................................16 Eliminacin de triggers:.............................................................................................................................................17 UTILIZACIN DE TRIGGERS PARA VALIDAR ACTUALIZACIONES DE TABLAS......................................................................................18 Tablas Inserted y Deleted:..........................................................................................................................................18 Insercin mltiple:......................................................................................................................................................18 Borrado mltiple:........................................................................................................................................................18 TRIGGERS Y TRANSACCIONES .................................................................................................................................................20 UN EJEMPLO COMPLETO ........................................................................................................................................................21 Creacin de la base de datos:.....................................................................................................................................21 Definicin de procedimientos almacenados:...............................................................................................................22 Definicin de triggers:................................................................................................................................................23 BIBLIOGRAFA......................................................................................................................................................................26

Pgina 2

Taller MS Server 7.0 Lenguaje Transact Sql

Programacin de Bases de Datos en SQL Server 7.0


Los procedimientos almacenados y los triggers permiten mejorar el rendimiento de .las bases de datos en SQL Server, al tiempo que automatizan el proceso de actualizacin de los datos siguiendo las decisiones y procesos de negocio. Entre las principales caractersticas de las que Microsoft ha deseado dotar a SQL Server 7.0 podramos destacar su facilidad de administracin, su casi ntima integracin con Windows NT y sus excelentes rendimientos en entornos hardware relativamente modestos. Microsoft presenta a su gestor de bases de datos como un producto que permite obtener grandes rendimientos en la gestin de los datos, pero, sobre todo, como un motor de bases de datos que es capaz de asumir las decisiones de negocio en la actualizacin de los datos, de manera que las aplicaciones cliente puedan simplificarse al no tener que contemplar las siempre complicadas tareas de validacin y respuesta a modificaciones.

Integrar las decisiones de negocio en la base de datos


Qu es la lgica de negocio? Podramos decir, de manera coloquial, que la lgica de negocio aplicada a los datos son reglas de coherencia de los mismos que vienen determinadas por la actividad de la empresa que los utiliza. Pongamos como ejemplo una empresa que se dedica a actividades comerciales y desea incentivar a todos sus empleados con un aumento de sueldo cuando se haya alcanzado una cifra determinada de ventas. Si la empresa almacena dichas ventas y los sueldos de sus empleados en campos de su base de datos, la realizacin de una determinada venta, la que hace el nmero

Pgina 3

Taller MS Server 7.0 Lenguaje Transact Sql

deseado y que har que los sueldos se aumenten, debera provocar la actualizacin de los sueldos de todos los empleados. Tras aadir la nueva venta los sueldos de los empleados, sin actualizar, contienen datos que en principio pueden pensarse como perfectamente correctos, pero que desde el punto de vista de la empresa no lo son. Podemos decir que la dinmica del negocio de la empresa ha impuesto, por s misma, una cierta lgica que los datos de la base de datos deben respetar para que la base de datos se mantenga sintcticamente coherente. La recomendacin es que el cumplimiento de la lgica de los negocios que utilizan como gestor de bases de datos SQL Server 7.0 no se consiga a travs de aplicaciones cliente externas que comprueben las condiciones que deben cumplirse, bien a intervalos regulares o en cada modificacin de los datos de la base. La filosofa que debe aplicarse es dotar a la base de datos de una serie de mecanismos para que ella misma se mantenga siempre coherente, respondiendo de manera automtica a las modificaciones de los datos y realizando las actualizaciones que sean necesarias. Con esta manera de operar se obtienen entornos ms autosuficientes y con aplicaciones cliente mucho ms sencillas. Sin embargo, la base de datos debe definirse, o mejor, programarse, mediante un mecanismo que denominamos triggers.

Obtener buenos rendimientos


La clave de los buenos rendimientos de SQL Server 7.0 es quiz su estrecho vnculo con el sistema operativo que le lleva a sacar partido mximo del mismo y del hardware. Por otra parte, cualquier administrador de una gestor de base de datos sabe que para que una consulta se lleve a cabo de manera eficiente es necesario que est adecuadamente optimizada. Este proceso de optimizacin es generalmente uno de los ms costosos en el ciclo de trabajo del gestor en la obtencin de datos. En entornos cliente /servidor las aplicaciones cliente enviarn consultas al gestor, que deber optimizarlas, procesarlas y devolver los resultados.

Pgina 4

Taller MS Server 7.0 Lenguaje Transact Sql

Afortunadamente los usuarios de la base de datos no suelen ser demasiado imaginativos, de manera que muchas de las consultas u operaciones con los datos suelen obedecer a un patrn o modelo que se repite muy frecuentemente. Inmediatamente surge la idea de que el administrador cree por su cuenta las consultas ms repetidas y las ofrezca a los clientes, facilitando su operacin y uniformando los formatos de peticiones de datos. Esta idea, si bien es interesante, no conlleva necesariamente una mejora en los rendimientos del gestor, sino simplemente una simplificacin de los procesos. Para conseguir mejores rendimientos SQL Server incluye el concepto de procedimientos almacenados como objetos de la base de datos que representan secuencias de sentencias SQL que se preoptimizan y preprocesan antes de su almacenamiento, de manera que estos costosos procesos se evitan en cada peticin de datos por parte de los usuarios. En los siguientes apartados pasaremos a describir, a modo de introduccin, como iniciarse en el aprovechamiento de los triggers y los procedimientos almacenados, es decir, daremos algunas claves introductorias a la programacin de bases de datos en SQL Server 7.0

Pgina 5

Taller MS Server 7.0 Lenguaje Transact Sql

Qu es un procedimiento almacenado
Como ya hemos comentado, un procedimiento almacenado (stored procedure) no es ms que una coleccin de sentencias Transact SQL (el dialecto SQL de SQL Server 7.0) que se constituye como si de una funcin de un lenguaje estructurado (C, Pascal ) se tratase. Es decir, es posible llamarlo mediante un identificador, puede recibir argumentos y devolver un valor de retorno. Transact SQL, es una versin extendida del lenguaje ANSI SQL que posee caractersticas que hacen que puedan definirse pseudo funciones. As, y a modo de ejemplo, es posible definir variables, posee estructuras de control de flujo, etc. La caracterstica primordial de los procedimientos almacenados es que se optimizan en el momento de su creacin. Esto supone que, a diferencia de lo que sucede con las sentencias SQL que se envan el gestor de manera interactiva, los procedimientos almacenados pasan previamente por un proceso de normalizacin. Cuando se crea un procedimiento almacenado el procesador de consultas del gestor crea una versin del mismo con una cierta estructura normalizada, y la almacena en una de las tablas de sistema. Las siguientes ejecuciones de dicho procedimiento, no necesitarn consumir el tiempo necesario para llevar a cabo este proceso de normalizacin, con lo que su ejecucin ser ms rpida. Por otra parte, cuando el procedimiento se ejecuta por vez primera, se produce su compilacin y la optimizacin del acceso del procedimiento a los datos. Este proceso optimizado se mantiene en memoria para posteriores ejecuciones con el consiguiente ahorro adicional de tiempo y recursos.

Pgina 6

Taller MS Server 7.0 Lenguaje Transact Sql

Qu es un trigger
Un trigger no es ms que un tipo especial de procedimiento almacenado. En lugar de ejecutarse como respuesta a una llamada, se ponen en funcionamiento automticamente como respuesta a ciertas modificaciones de los datos, cuya naturaleza se especifica en el momento de la creacin del trigger. La utilidad de los triggers es mltiple. Quiz la ms ampliamente utilizada es la de establecer reglas de consistencia entre los datos presentes en las diferentes tablas de nuestra base de datos. Los triggers son una herramienta poderosa para centralizar en la base de datos la toma de las decisiones de negocio que se asocian a los datos de la misma. De esta manera se descarga en gran medida a las aplicaciones cliente de la tarea de revisar las acciones de actualizacin de datos. Como hemos dicho, las acciones que motivarn que un trigger se ponga en ejecucin, es decir aquellas acciones que disparan el trigger, son modificaciones que puedan llevarse a cabo en los datos, tanto la adicin de datos nuevos como la eliminacin de datos existentes. Dichas modificaciones se llevan a cabo, evidentemente, mediante la ejecucin de las sentencias UPDATE, DELETE o INSERT. Supongamos el caso en el que existan dos tablas Existencias y Ventas de manera que cada vez que se produce una nueva venta deben actualizarse las unidades que an quedan en existencias. La solucin a este problema, si se sigue la filosofa de toma de decisiones mediante triggers que Microsoft recomienda utilizar con SQL Server, es dejar que sea la propia base de datos la que se encargue de realizar las actualizaciones de manera automtica. Es posible definir un trigger que realice las tareas descritas y que se ponga en ejecucin inmediatamente despus a la operacin de borrado o insercin. As, cuando dicha accin de modificacin se complete, el trigger adecuado se disparar. Pueden definirse triggers que

Pgina 7

Taller MS Server 7.0 Lenguaje Transact Sql

respondan a una o varias de estas acciones, es decir, puede definirse un trigger que responda tanto a una operacin INSERT, como a una DELETE. De este modo, los triggers pueden utilizarse para resolver, entre otras, las siguientes situaciones: Preservar la integridad referencial. En el caso en que dos o ms tablas en una base de datos se hallen ligadas por claves ajenas no ser posible modificar datos en la tabla primaria sin modificar aquellos que se hallen vinculados a l en la tabla subordinada. Utilizando triggers podemos controlar este proceso forzando a que los registros dependientes sean eliminados cuando llevamos a cabo un DELETE en la tabla principal. Establecimiento de condiciones complejas: Los triggers permiten, como veremos ms adelante, especificar condiciones para que los datos de una o varias columnas sean considerados vlidos. Respuesta a cambios de estado de la tabla: Los triggers permiten examinar el estado de la tabla antes y despus de que una determinada tarea de modificacin haya sido llevada a cabo y obrar en consecuencia.

Creacin de procedimientos almacenados


Existen dos maneras de crear procedimientos almacenados: utilizando la sentencia CREATE PROCEDURE y mediante Enterprise Manager La sentencia CREATE PROCEDURE: La sentencia Transact-SQL que permite crear procedimientos almacenados es CREATE PROCEDURE. Permite crear un procedimiento almacenado a partir de una determinada coleccin de sentencias SQL ligadas por sentencias adicionales de control de flujo.

Pgina 8

Taller MS Server 7.0 Lenguaje Transact Sql

La sintaxis de esta sentencia es la siguiente: CREATE PROCEDURE [propietario.] procedimiento[;nmero] [(lista de parmetros) ] [{FOR REPLICATION} | {WITH RECOMPILE} [{[WITH] | [,]} ENCRYPTION]] AS sentencias SQL nombre de

Creacin de procedimientos almacenados mediante Enterprise Manager : Hasta este momento hemos presentado la sintaxis de la sentencia Transact SQL que permite crear procedimientos almacenados. A continuacin explicaremos el procedimiento necesario para crear un procedimiento almacenado mediante Enterprise Manager . Para ello debern seguirse los siguientes pasos: Acceder a la ventana Server Manager y al nodo Stored Procedures. Una vez accedido pulsar el botn derecho del ratn y elegir la orden de men New Stored Procedure. Especificar la misma sentencia de creacin de procedimiento almacenado que pusimos antes como ejemplo. Pulsar el botn Save Object. En la ventana Server Manager aparecer el nuevo procedimiento almacenado.

Sentencias SQL del procedimiento almacenado


El cuerpo del procedimiento estar integrado por un conjunto de sentencias SQL que realizarn las tareas que esperamos del mismo y que se especificarn en la definicin del procedimiento siguiendo a la clusula AS.

Pgina 9

Taller MS Server 7.0 Lenguaje Transact Sql

En general podemos decir que en almacenado pueden incluirse cualquier nmero Transact SQL. Sin embargo, es necesario restricciones respecto a la creacin de objetos las siguientes sentencias CREATE : CREATE VIEW CREATE TRIGGER CREATE DEFAULT CREATE PROCEDURE CREATE RULE

un procedimiento y tipo de sentencias comentar algunas No pueden incluirse

Procedimientos de recompilacin forzosa:


Imaginemos que generamos un procedimiento almacenado cuyos parmetros puedan ser de tipos muy diversos. Esto supondr que sea comn que la optimizacin que se ha llevado a cabo en primera instancia, no sea vlida para otras ejecuciones del procedimiento. Por otra parte, es comn que frecuentemente se aadan nuevos ndices que hagan que la optimizacin de la consulta deje tambin de ser vlida. El rendimiento en este tipo de situaciones no es el ms adecuado, pues se ralentizan las operaciones. Es en estos casos es necesario que el procedimiento almacenado se recompile cada vez que se ejecuta, deshabilitando la caracterstica de optimizacin nica que antes hemos presentado. La clusula que permite indicar que el procedimiento debe ser recompilado en cada ejecucin es WITH RECOMPILE .

Eliminacin de procedimientos almacenados


La sentencia DROP PROCEDURE sirve para eliminar del catlogo un procedimiento almacenado y su sintaxis y uso resulta totalmente anlogo a las que se utilizan para eliminar cualquier otro objeto de una base de datos .

Pgina 10

Taller MS Server 7.0 Lenguaje Transact Sql

Parmetros
Como hemos comentado anteriormente, los procedimientos almacenados permiten que su ejecucin pueda ser adaptada a la situacin y mbito en el que sean llamados. Para ello, al igual que las funciones y procedimientos en lenguajes de programacin estructurada, pueden recibir parmetros. As el procedimiento recibir datos diversos en funcin de la situacin en la que la llamada se realice. La definicin de parmetros se lleva a cabo en el momento de la creacin del procedimiento almacenado. Cuando el usuario solicite la ejecucin de un procedimiento definido con parmetros deber suministrar valores para ellos. La sintaxis de definicin de un parmetro es la siguiente: Sintaxis de definicin de parmetros @nombre_de _parmetro tipo_de_datos [= valor por defecto] [OUTPUT] Puede especificarse un valor por defecto para cada parmetro. La manera de especificar un valor por defecto es colocar despus del nombre de parmetro el signo = seguido por la constante que se utilizar como valor. De igual modo, tambin es posible definir ciertos parmetros como de retorno. Este tipo de parmetros se especifican como cualquier otro, con la salvedad de que sus nombres aparecen seguidos por la palabra clave OUTPUT. Cuando el procedimiento se ejecute devolver en esos parmetros los valores que hayan tomado en el interior del mismo. Estos valores podrn ser almacenados en variables y utilizados posteriormente.

Ejecucin de procedimientos almacenados

Pgina 11

Taller MS Server 7.0 Lenguaje Transact Sql

Una vez creado un procedimiento almacenado, se encontrar en disposicin de ser ejecutado. Si en la primera lnea de una secuencia de sentencias Transact_SQL aparece el nombre de un procedimiento almacenado, SQL Server lo ejecutar. En el resto de las situaciones deberemos utilizar la sentencia EXECUTE . Esta sentencia se utiliza para la ejecucin de todo tipo de procedimientos almacenados, tanto de sistema, como de usuario. Por otra parte tambin permite la ejecucin de una cadena de caracteres que contiene una cierta sentencia Transact_SQL Su sintaxis es la siguiente: EXEC[ute] {[@valor de retorno =]{[[[nombreproc[;num]| @variablenombre} [[@parmetro =] {valor | @variable [OUTPUT]] [, [@parmetro =] {valor | @variable [OUTPUT]}]...] [WITH RECOMPILE]] El procedimiento que se ejecutar es el especificado en nombreproc. El nombre del procedimiento puede estar contenido en una variable como aqu @variablenombre. Valor de retorno: Como hemos comentado anteriormente, los procedimientos almacenados pueden, opcionalmente devolver un valor. Si esto es as, este valor retornado deber ser almacenado en una variable que en la sintaxis hemos presentado como @valor de retorno.

Pgina 12

Taller MS Server 7.0 Lenguaje Transact Sql

Informacin retornada por un procedimiento almacenado


Los procedimientos almacenados pueden retornar informacin al procedimiento que los llam o al usuario que solicita su ejecucin bsicamente de dos modos: Mediante el retorno de un valor de estado. Mediante parmetros de retorno. Valor de estado (status value) : Es una prctica comn en la mayora de lenguajes de programacin el hacer que los procedimientos o funciones retornen un valor que permita testear cual ha sido el modo o resultado con el que la ejecucin de dicha funcin ha concluido. Generalmente dichos valores son definidos de antemano de manera que un mero anlisis del valor de estado permita conocer qu ha sucedido. Los procedimientos almacenados SQL Server devuelven tambin un valor de estado o status value. Este valor puede ser almacenado en una variable de manera que pueda examinarse posteriormente para valorar el xito de su ejecucin o el motivo de su fracaso. Veamos un ejemplo: Devolucin de valor de estado definido por el usuario Este procedimiento devuelve 100 si un determinado alumno de una hipottica tabla alumnos est aprobado y 200 en caso contrario CREATE PROCEDURE aprobado @nombrealumno varchar(20) AS IF (SELECT nota FROM alumnos WHERE nombre @nombrealumno) > 5 RETURN 100
Pgina 13

Taller MS Server 7.0 Lenguaje Transact Sql

ELSE RETURN 200 Podramos definir un nuevo procedimiento almacenado que utilice a este primero Este procedimiento presenta un mensaje indicando si un determinado alumno est aprobado o no, utilizando el procedimiento aprobado CREATE PROCEDURE mostrarestado @nombrealumno varchar(20) AS DECLARE @valorderetorno int EXECUTE @valorderetorno = aprobado @nombrealumno IF (@valorderetorno = 100 ) PRINT Alumno aprobado ELSE PRINT Alumno suspenso Retorno de parmetros: En el momento de la creacin y definicin de un procedimiento almacenado puede especificarse que alguno, o todos, los parmetros que dicho procedimiento aceptar sean considerados parmetros de retorno. Veamos un ejemplo de uso de procedimiento almacenado con paso de parmetros Este procedimiento realiza la suma de dos variables enteras y devuelve una variable entera como un parmetro de salida: CREATE PROCEDURE suma @sum1 int, @sum2 int, @res int OUTPUT AS SELECT @res = @ sum1 + @sum2 RETURN 0 Veamos un ejemplo de utilizacin
Pgina 14

Taller MS Server 7.0 Lenguaje Transact Sql

DECLARE @resultado int DECLARE @retorno int EXECUTE @retorno = suma 2, 2, @resultado OUTPUT En este punto @retorno valdr 0 y @resultado tendr como valor 4.

Pgina 15

Taller MS Server 7.0 Lenguaje Transact Sql

Triggers
Creacin de triggers: La sentencia Transact-SQL que permite crear triggers es CREATE TRIGGER. CREATE TRIGGER [propiet.] [propiet.]nombretabla FOR {INSERT, UPDATE, DELETE} [WITH ENCRYPTION] AS sentenciasSQL Tambin Manager. es posible crear triggers nombretrigger ON

mediante

Enterprise

Acciones que desatan la ejecucin del trigger: El trigger se ejecuta como respuesta a la aplicacin de ciertas sentencias de modificacin sobre la tabla asociada al mismo. Estas sentencias se especifican en la clusula FOR UPDATE/INSERTDELETE Cuando se lleven a cabo la o las acciones que se especifiquen en la definicin del trigger sobre la tabla, las sentencias que lo conforman se ejecutarn. De esta manera, pueden definirse hasta tres triggers diferentes para cada tabla, uno por cada accin INSERT, UPDATE o DELETE. En cualquier caso, es posible especificar en un slo trigger, cualquier combinacin de las tres acciones disponibles. Sentencias SQL del trigger : El cuerpo del trigger constar de una serie de sentencias SQL que realizarn las tareas que esperamos del mismo y una serie de condiciones que determinarn de manera adicional si las acciones del trigger deben ser llevadas o no cabo.

Pgina 16

Taller MS Server 7.0 Lenguaje Transact Sql

En general podemos decir que en un trigger, como en cualquier procedimiento almacenado, pueden incluirse cualquier nmero y tipo de sentencias Transact SQL. Sin embargo, y por su propia naturaleza, la de responder a una accin ejecutando otras, no es posible incluir en las sentencias del trigger la sentencia SELECT. No son estas las nicas restricciones aplicables a las sentencias ejecutables en un trigger. Concretamente las siguientes sentencias no pueden utilizarse. Sentencias de creacin: No puede incluirse ninguna sentencia CREATE. Sentencias de eliminacin de objetos: No pueden eliminarse objetos, por lo que no est permitido utilizar ninguna de las sentencias de la familia DROP . Sentencias de modificacin de objetos: No puede alterarse la estructura de tablas ni bases de datos mediante las sentencias ALTER DATABASE, ALTER TABLE. Sentencias de borrado de filas: No puede utilizarse la sentencia TRUNCATE TABLE para borrar todas las filas de una tabla. Permisos: No pueden otorgarse ni retirarse permisos, por lo que no son utilizables GRANT y REVOKE. Eliminacin de triggers: Para eliminar un trigger puede utilizarse la sentencia DROP TRIGGER, anlogamente al resto de objetos. Puede eliminarse ms de un trigger de manera simultnea pasando a la sentencia sus nombres separados por comas. DROP TRIGGER [prop.]nombretrigger2...] [prop.]nombretrigger1 [,

Pgina 17

Taller MS Server 7.0 Lenguaje Transact Sql

Utilizacin de triggers actualizaciones de tablas

para

validar

Una de las principales utilidades de los triggers es la de controlar que las operaciones de actualizacin que se llevan a cabo sobre una tabla sean coherentes. De este modo podemos centralizar en la base de datos los procesos de validacin de datos, tanto al aadir nuevos registros como en su eliminacin. Tablas Inserted y Deleted: En multitud de ocasiones las operaciones de actualizacin de la tabla que suponen insercin y borrado de filas se llevan a cabo en cadena, normalmente por la propia naturaleza de las sentencias implicadas. En este tipo de situaciones el trigger que deba responder a estas acciones puede necesitar valorar qu cambios se han producido sobre la tabla de manera que se pueda obrar en consecuencia. Para ello se necesitara disponer de algn modo de informacin del estado de la tabla antes y despus de las modificaciones efectuadas. Para ello SQL Server proporciona dos tablas temporales denominadas Inserted y Deleted. Para conocer el nmero de filas modificadas por una sentencia de actualizacin determinada es posible acudir a la variable global @@rowcount. Esta variable contiene el nmero de filas modificadas. Insercin mltiple: La tabla inserted almacena una copia de las filas que se han aadido durante la ejecucin de una sentencia INSERT o UPDATE sobre una tabla que tiene asociado un trigger. Borrado mltiple:

Pgina 18

Taller MS Server 7.0 Lenguaje Transact Sql

La tabla deleted almacena una copia de las filas eliminadas durante una sentencia DELETE o UPDATE. Evidentemente, una vez realizada la operacin de borrado, las filas desaparecern de la tabla asociada al trigger y slo aparecern en la tabla deleted.

Pgina 19

Taller MS Server 7.0 Lenguaje Transact Sql

Triggers y transacciones
Los triggers pueden descartar las transacciones en el marco de las cuales se ejecutan. Es decir, los triggers pueden ser ejecutados en respuesta a una accin que se haya inmersa en una transaccin. Si uno de estos triggers contiene la sentencia ROLLBACK TRANSACTION, que recordemos tiene como resultado el descartar las operaciones realizadas en la transaccin en curso, la transaccin completa en la que dicho trigger se ejecuta ser descartada. Veamos un ejemplo en que la operacin UPDATE tiene asociado un trigger que, por cualquier circunstancia que no nos detendremos a concretar, provoca que la transaccin en curso sea descartada mediante ROLLBACK. En el ejemplo que sigue la operacin INSERT no se ejecutar, pues la transaccin se dar por finalizada despus de la sentencia UPDATE. BEGIN TRANSACTION UPDATE alumnos SET nota = nota + 1 WHERE notapracticas = 10 INSERT alumnos VALUES ('Javier Mrquez', Grupo3, 5.5, 6.3, '6/11/96') END TRANSACTION

Pgina 20

Taller MS Server 7.0 Lenguaje Transact Sql

Un ejemplo completo
Para ilustrar los conceptos expuestos en este artculo vamos a presentar un pequeo ejemplo en el que se utilizan tanto procedimientos almacenados como triggers. Nos proponemos informatizar una biblioteca creando una base de datos que mantenga informacin de los volmenes existentes en su fondo, de los socios inscriptos y de los prstamos efectuados. Evidentemente, nuestro objetivo es simplemente ilustrar el sentido y necesidad de procedimientos almacenados y triggers por lo que el diseo se ha simplificado al mximo evitando cualquier tipo de consideracin sobre el modelo de datos. Creacin de la base de datos: El primer paso ser definir siquiera burdamente las tablas necesarias. Del ms sencillo anlisis resulta que es necesario, al menos, definir una tabla libros, una segunda autores, una tercera socios, y una cuarta prestamos, que servir para almacenar cada accin de prstamo que se lleve a cabo. La definicin de las tablas podemos realizarla mediante Enterprise Manager o utilizando sentencias Transact SQL. Por simplicidad haremos uso de las herramientas visuales de Enterprise Manager. Las sentencias Transact_Sql mnimas equivalentes seran:
Tabla libros:

CREATE TABLE libros (registro smallint signatura char(20), titulo varchar(50), nombreautor varchar(50) editorial varchar(20), fechaentrada datetime)
Tabla autores:

Pgina 21

Taller MS Server 7.0 Lenguaje Transact Sql

CREATE TABLE autores (idautor smallint nombreautor varchar(50), nacionalidad varchar(20))


Tabla socios:

CREATE TABLE socios (idsocio smallint nombresocio varchar(50), edad smallint, direccion varchar(20), telfono varchar(10))
Tabla prestamos:

CREATE TABLE prestamos (idprestamo smallint idautor smallint, idsocio smallint, fechaprestamo datetime) Definicin de procedimientos almacenados: Se supone que la base de datos estar disponible al pblico que visite la biblioteca para que puedan consultar por su cuenta, por ejemplo, los libros de un determinado autor. La manera de hacer posibles estas consultas generalmente ser mediante la programacin de una pequea aplicacin cliente que enviar a SQL Server las peticiones de datos. Parece evidente que la consulta Libros de un autor ser muy frecuente, de manera que ser adecuado y adecuado definir en la base de datos un procedimiento almacenado que reciba como argumento el nombre del autor del que se desea conocer su obra completa. Este procedimiento se almacenar en SQL Server y su ejecucin ser solicitada por las aplicaciones cliente, obteniendo un rendimiento mejor al que puede obtenerse con la simple realizacin

Pgina 22

Taller MS Server 7.0 Lenguaje Transact Sql

de la consulta. Veamos una posible implementacin de este procedimiento.


Procedimiento ObraPorAutor

CREATE PROCEDURE ObraPorAutor @nautor varchar(50) AS SELECT titulo, editorial, cantidad FROM libros WHERE nombreautor = @nautor Definicin de triggers: Existen mltiples situaciones en las que en este ejemplo sera interesante definir un trigger. Una primera muestra sera la del control de prstamo. Imaginemos que deseamos evitar que cada socio pueda tener ms de un libro simultneamente en su poder. Cada vez que se realiza un prstamo nuevo la aplicacin cliente solicitar la insercin de una nueva fila en la tabla de prstamos. Podramos escribir un trigger que tras cada insercin en esta tabla, buscase si existe alguna otra fila en la misma que corresponda a un prstamo al mismo socio, y que eliminase el nuevo prstamo si ya exista uno an no terminado. La aplicacin cliente podra recibir informacin en la que examinase si la insercin se haba realizado correctamente y presentar, si as se desea un mensaje explicativo. Pero, lo que es ms importante, los datos de la base de datos seran coherentes. Veamos este ejemplo:
Insercin condicional de un prstamo

CREATE TRIGGERprestamocondicional ON prestamos FOR INSERT AS IF (SELECT COUNT(*) FROM prestamos, inserted WHERE prestamos.idsocio = inserted. idsocio ) <> @@rowcount BEGIN DELETE * FROM prestamos
Pgina 23

Taller MS Server 7.0 Lenguaje Transact Sql

WHERE prestamos. idprestamo = inserted. idprestamo END Otra posibilidad es la de gestionar la correspondencia entre la tabla libros y la tabla autores cuando se da de baja un ejemplar por prdida, sustraccin o cualquier otra circunstancia. En este caso el trigger deber examinar, tras la eliminacin de un libro, si existe el autor del libro eliminado tiene an algn volumen en el fondo de la biblioteca, eliminando su entrada en la tabla autores si no es as. El trigger sera similar al siguiente:

Pgina 24

Taller MS Server 7.0 Lenguaje Transact Sql

Eliminacin condicional de un autor

CREATE TRIGGER comprobarautor ON libros FOR DELETE AS IF (SELECT COUNT(*) FROM libros WHERE libros.idautor = deleted. idautor ) > 0 BEGIN DELETE * FROM autores WHERE autores. idautor = deleted. idautor END

Pgina 25

Taller MS Server 7.0 Lenguaje Transact Sql

Bibliografa
Recopilacin basada en un artculo Delgado / HISPAN TECNOLOGIC perteneciente a Alberto

http://www.hispan.com/eltaller/losarticulos.htmhttp://www.hispan.co m/eltaller/losarticulos.htm

Pgina 26