Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TALLER
MS SQL SERVER 7
Lenguaje Transact SQL (Primera Parte)
( 2002)
Docentes:
Ing. Cintia Vernica Gioia. Leandro Ezequiel Diato.
Pgina 1
Pgina 2
Pgina 3
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.
Pgina 4
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
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
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
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.
Pgina 8
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.
Pgina 9
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
Pgina 10
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.
Pgina 11
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
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
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
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
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
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
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
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
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
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
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
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
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
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