10325656 Procedimientos Almacenados y Triggers en SQL Server

8
1 Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS Procedimientos almacenados y Triggers en SQL Server 6.5 Por Fernando González Procedimientos almacenados Un procedimiento almacenado es un objeto perteneciente a una base de datos, que contiene un conjunto de instrucciones SQL, tanto de consulta, como de manipulación de datos, como de control de la secuencia del programa, asociados a un nombre, y que son ejecutados en conjunto. Puede contener parámetros tanto de entrada como de salida (parámetros pasados por referencia), así como devolver un valor de retorno. Son precompilados al ejecutarse por primera vez, y no vuelven a ser compilados con las subsiguientes ejecuciones, lo que proporciona una cierta mejora en el rendimiento. No obstante si se desea se puede forzar su recompilación. Una de las principales ventajas de este tipo de objetos, es que al residir en la propia base de datos son compartibles por todos los usuarios, pudiendo de esta manera beneficiarse de los distintos cachés del servidor. Al mismo tiempo al ser código externo a la aplicación puede ser alterado sin que exista siempre la necesidad de modificar el código de la misma. Al ser objetos de la base de datos se hallan sujetos a los esquemas de seguridad determinados por el administrador de la misma: Existen diversas clases de procedimientos almacenados, entre los que se encuentra los procedimientos almacenados del sistema, que sirven de herramientas para la realización de distintas tareas de administración. Un procedimiento almacenado se crea con la sentencia CREATE PROCEDURE, que debe ser la única dentro de un mismo batch. La creación de un procedimiento almacenado puede ser realizada bien desde el ISQL_W, bien desde la opción Manage.Stored Procedures del Enterprise Manager, o bien desde la propia ventana donde se muestran los objetos de la base de datos, en el grupo correspondiente a los procedimientos almacenados, dentro de esta última herramienta. La sintaxis de dicha instrucción es básicamente la siguiente: CREATE PROCEDURE Nombre_del_procedimiento [Lista_de_parámetros] AS (Sentencias SQL) [RETURN [Valor]] Donde: Nombre_del_procedimiento Identificador que determina el nombre asignado al procedimiento y que debe cumplir con la regla de definición de identificadores establecida en MSSQL Server. Lista_de_parámetros Parámetros definidos en el procedimiento con la siguiente sintaxis: @nombre_var Tipo_var [OUTPUT]

Transcript of 10325656 Procedimientos Almacenados y Triggers en SQL Server

Page 1: 10325656 Procedimientos Almacenados y Triggers en SQL Server

1Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

Procedimientos almacenados yTriggers en SQL Server 6.5

Por Fernando González

Procedimientos almacenados

Un procedimiento almacenado es un objeto perteneciente a una base de datos, que contieneun conjunto de instrucciones SQL, tanto de consulta, como de manipulación de datos, como decontrol de la secuencia del programa, asociados a un nombre, y que son ejecutados enconjunto. Puede contener parámetros tanto de entrada como de salida (parámetros pasadospor referencia), así como devolver un valor de retorno.

Son precompilados al ejecutarse por primera vez, y no vuelven a ser compilados con lassubsiguientes ejecuciones, lo que proporciona una cierta mejora en el rendimiento. Noobstante si se desea se puede forzar su recompilación.

Una de las principales ventajas de este tipo de objetos, es que al residir en la propia base dedatos son compartibles por todos los usuarios, pudiendo de esta manera beneficiarse de losdistintos cachés del servidor. Al mismo tiempo al ser código externo a la aplicación puede seralterado sin que exista siempre la necesidad de modificar el código de la misma.

Al ser objetos de la base de datos se hallan sujetos a los esquemas de seguridad determinadospor el administrador de la misma:

Existen diversas clases de procedimientos almacenados, entre los que se encuentra losprocedimientos almacenados del sistema, que sirven de herramientas para la realización dedistintas tareas de administración.

Un procedimiento almacenado se crea con la sentencia CREATE PROCEDURE, que debe serla única dentro de un mismo batch. La creación de un procedimiento almacenado puede serrealizada bien desde el ISQL_W, bien desde la opción Manage.Stored Procedures delEnterprise Manager, o bien desde la propia ventana donde se muestran los objetos de la basede datos, en el grupo correspondiente a los procedimientos almacenados, dentro de estaúltima herramienta.

La sintaxis de dicha instrucción es básicamente la siguiente:

CREATE PROCEDURE Nombre_del_procedimiento[Lista_de_parámetros]AS(Sentencias SQL)[RETURN [Valor]]

Donde:

Nombre_del_procedimiento Identificador que determina el nombre asignado al procedimientoy que debe cumplir con la regla de definición de identificadoresestablecida en MSSQL Server.

Lista_de_parámetros Parámetros definidos en el procedimiento con la siguientesintaxis:

@nombre_var Tipo_var [OUTPUT]

Page 2: 10325656 Procedimientos Almacenados y Triggers en SQL Server

2Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

El símbolo @ es necesario no sólo en la declaración sino queforma parte del propio nombre. La claúsula OUPUT determinaque dicho parámetro será utilizado para pasar información alcódigo llamador, es decir, viene a ser un parámetro pasado porreferencia.

Dicha lista puede contener un máximo de 255 parámetros.

Sentencias_SQL Como se explicó anteriormente, el cuerpo del procedimientopuede estar compuesto de cualquier tipo de instrucción SQL, aexcepción de las siguientes:

CREATE VIEWCREATE DEFAULTCREATE RULECREATE PROCEDURECREATE TRIGGER

Entre las instrucciones que puede contener, está la llamada aotros procedimientos almacenados, los cuales podrán acceder alos objetos pertenecientes al llamador, exceptuando las tablastemporales creadas por el mismo.

RETURN [Valor] Un procedimiento almacenado puede devolver un valor deretorno de tipo integer, no nulo, que puede ser rescatado por elcódigo llamador para tener conocimiento del resultado delproceso de dicho procedimiento. Los valores -1 al -99 estánreservados por el sistema, así como el 0 que se interpreta como“finalizado con éxito”. Si no se proporciona un código definidopor el usuario, se utilizan los del sistema. De la misma forma losdefinidos por el usuario tiene prioridad sobre los definidos por elsistema. En caso de producirse varios errores a lo largo de laejecución del mismo procedimiento, se devuelve el código cuyovalor absoluto es mayor. Algunos ejemplos de códigos y sussignificados son los siguientes:

Código Significado-2 Error de tipo de datos-4 Error de Permisos-5 Error de Sintaxis

-13 Base de Datos Corrupta

Llamadas a procedimientos almacenados

La sintaxis de la llamada a un procedimiento almacenado, depende de como se halla creadodicho procedimiento, por lo que en cada uno de los ejemplos que siguen, se especifica lallamada al mismo, poniéndose de manifiesto dicha sintaxis en cada caso particular.

Ejemplos

Como base de datos de trabajo para los ejemplos se a utilizado SOPORTEDB cuya estructuraes accesible por todos, con lo cual no se detalla en este documento ningún elemento referentea dicha estructura.

Page 3: 10325656 Procedimientos Almacenados y Triggers en SQL Server

3Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

Procedimiento 1

Es un procedimiento simple, sin parámetros que devuelve un conjunto de filas que cumplensiempre la misma condición.

CREATE PROCEDURE prod_1AS

SELECT * FROM CLIENTES

Llamada:

EXECUTE prod_1

Procedimiento 2

Es un procedimiento que recibe dos parámetros de entrada, correspondientes a un rango decódigos de clientes, y devuelve el conjunto de filas de la tabla CLIENTES cuyo código seencuentra en el rango determinado por los parámetros.

CREATE PROCEDURE prod_2@p_CodIni CHAR (6),@p_CodFin CHAR (6)

ASSELECT * FROM CLIENTE

WHERE IDCLIENTE BETWEEN @p_CodIni AND @p_CodFin

Llamada:

EXECUTE prod_2 ‘000100’, ‘000500’

Procedimiento 3

Es un procedimiento que recibe un parámetro de entrada y uno de salida. El parámetro deentrada corresponde a un código de tipo de producto y el de salida, el número de productosexistentes, que corresponden a dicho tipo.

CREATE PROCEDURE prod_3@p_CodTipProd CHAR (3),@p_NumProductos SMALLINT OUTPUT

ASSELECT @p_NumProductos = COUNT(*)

Page 4: 10325656 Procedimientos Almacenados y Triggers en SQL Server

4Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

FROM PRODUCTOSWHERE IDTIPROD = @p_CodTipProd

Llamada:

DECLARE @p_parmsal SMALLINTEXECUTE prod_3 ‘KBD’, @p_parmsal OUTPUT

Procedimiento 4

Es un procedimiento almacenado que realiza inserciones en una tabla, con los valoresdevueltos por un subquery realizado sobre otra tabla que tiene la misma estructura. El valordevuelto por el procedimiento almacenado, es el número de filas insertadas.

CREATE PROCEDURE prod_4AS

INSERT TIPSOPPRUSELECT * FROM TIPSOPORTE

RETURN @@ROWCOUNT

Llamada:

DECLARE @p_retorno INTEGEREXECUTE @p_retorno = prod_4

Triggers

Un trigger es un tipo especial de procedimiento almacenado que se ejecuta automáticamenteal intentarse efectuar una modificación de los datos, en la tabla a la que se encuentranasociados.

Las operaciones que pueden “disparar” un trigger son las correspondientes a las instruccionesSQL, INSERT, UPDATE y DELETE.

Puede definirse un trigger para cada una de ellas, o bien definir un trigger asociado a unacombinación de las mismas.

La mayor utilidad que se confiere a un trigger, es la de asegurar la integridad referencial o elcumplimiento de las distintas reglas definidas, si bien estas son operaciones que puedendelegarse en el propio servidor, mediante las instrucciones y cláusulas de especificación de lasreglas de integridad, definidas durante la creación de las tablas, o añadidas posteriormente.

El hecho de tener algún trigger asociado a una tabla, incide de forma negativa en cuanto alrendimiento se refiere, si bien la mayor parte del tiempo empleado en su ejecucióncorresponde al acceso a las diferentes tablas implicadas en los chequeos de integridad.

Page 5: 10325656 Procedimientos Almacenados y Triggers en SQL Server

5Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

En relación a la creación de los triggers, las herramientas disponibles son las mismas que en elcaso de los procedimientos almacenados, si bien deberán utilizarse las opcionescorrespondientes.

La instrucción que permite la creación de un trigger es CREATE TRIGGER, y su sintaxis es lasiguiente:

CREATE TRIGGER Nombre_del_TriggerON Nombre_de_la_tablaFOR {INSERT,UPDATE,DELETE}AS (Sentecias_SQL)

Donde:

Nombre_del_Trigger: Identificador que determina el nombre del trigger en la base dedatos y que debe cumplir las reglas de construcción deidentificadores en SQL Server.

Nombre_de_la_tabla Nombre de la tabla sobre la que será ejecutado el trigger, encaso de ser ésta alterada, en cuanto a datos se refiere.

INSERT Instrucción de inserción de filas.

UPDATE Instrucción de actualización de filas.

DELETE Instrucción de eliminación de filas.

Sentencias_SQL Cualquier tipo de sentencia SQL, a excepción de lassiguientes:

• Cualquier instrucción CREATE• Cualquier instrucción DROP• ALTER TABLE y ALTER DATABASE• SELECT INTO• GRANT y REVOKE

En el caso en que la instrucción CREATE TRIGGER forme parte de un conjunto deinstrucciones (Batch), ésta deberá ser la primera y sólo puede ser aplicada sobre una tabla.

Aunque desde el trigger pueden referenciarse objetos de otras bases de datos, éste sólo puedese creado en la base de datos en curso.

El intento de crear un trigger sobre un trigger ya existente, provoca la sustitución inmediata ysin aviso, del anterior.

Los triggers pueden ser anidados y permiten un nivel máximo de anidamiento de 16. En casode que un trigger caiga en un bucle infinito, se acabará producción un error de desbordamientodel nivel de anidamiento.

Los triggers no son reentrantes lo que quiere decir que en caso de que un trigger en ejecución,realice una actualización que provoque la activación del mismo, tal activación no se producirá.

Con relación a las transacciones hay que decir que en el caso de comenzarse una transaccióny activarse un trigger que contenga y ejecute el comando ROLLBACK TRANSACTION, éstedeshará la transacción completa iniciada antes de su activación.

Page 6: 10325656 Procedimientos Almacenados y Triggers en SQL Server

6Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

Otra de las mayores utilidades de los triggers es deshacer transacciones iniciadas antes de suactivación, como consecuencia de un error detectado durante su ejecución.

Ejemplos

Seguidamente se muestran algunos ejemplos de triggers.

Trigger 1

La tabla CPOSTALES no está sometida a ningún control de integridad referencial, con lo cualpara evitar eliminar una fila que tenga una referencia en la tabla CLIENTES, se define untrigger que impida tal hecho. Dado que la acción a realizar es deshacer una transacción,suponemos que ésta ha sido previamente iniciada en el procedimiento principal.

CREATE TRIGGER Trig_1ON CPOSTALFOR DELETEAS

DECLARE @p_cuenta SMALLINTSELECT @p_cuenta = COUNT(*)

FROM CLIENTES CLIWHERE CLI.IDPROVIN = CPOSTAL.IDPROVIN AND

CLI.RESTCDPOSTAL = CPOSTAL.RESTCDPOSTALIF @p_cuenta > 1 BEGIN

ROLLBACK TRANSACTION RAISERROR(‘ESTA FILA CONTIENE REFERENCIAS EN TABLA CLIENTES’,16,-1)

END

Trigger 2

Partiendo de la tabla del ejemplo 1, estableceremos un trigger que efectúe una actualizaciónen cascada, en el supuesto de intentar modificar un código postal que contenga referencias enla tabla Cliente.

CREATE TRIGGER Trig_2ON CPOSTALFOR UPDATEAS

DECLARE @p_cuenta SMALLINTSELECT @p_cuenta = COUNT(*)

FROM CLIENTES CLIWHERE CLI.IDPROVIN = CPOSTAL.IDPROVIN AND

CLI.RESTCDPOSTAL = CPOSTAL.RESTCDPOSTAL

IF @p_cuenta > 1BEGIN

UPDATE CLIENTESSET CLIENTES.IDPROVIN = updated.IDPROVIN,

CLIENTES.RESTCDPOSTAL = updated.RESTCDPOSTALWHERE CLIENTES

Page 7: 10325656 Procedimientos Almacenados y Triggers en SQL Server

7Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

RAISERROR (‘FILAS ACTUALIZADAS EN TABLA CLIENTES’, 16, -1)END

Función RaiseError

Esta función es utilizada para comunicar errores al cliente, definidos por el programador.

Los mensajes correspondientes a estos errores, pueden residir en una tabla especial de labase de datos, llamada sysmessages, o bien pueden ser creados en tiempo de ejecución.

Cada error tiene asociado un código numérico de 5 dígitos, un literal, y otros valores añadidosque se comentarán más adelante.

Los errores definidos por el usuario deben tener un código no inferior a 50001, debido a que elresto están reservados por el sistema.

Para los errores definidos en tiempo de ejecución, este código es asignado automáticamentepor el sistema y es igual a 50000.

La cadena que constituye el mensaje propiamente dicho, puede contener argumentos desustitución, esto es parámetros.

La forma en que se especifican éstos y sus tipos, guarda semejanza a la utilizada por lafunción Printf del lenguaje C.

La sintaxis de esta función es la siguiente:

RAISERROR (id_msg|str_msg, gravedad, estado, lista_de_argumentos)

Donde:

id_msg Código identificativo del mensaje. Numérico mayor que 50000.Str_msg Cadena que constituye el mensaje. La declaración de variables de

sustitución se detalla al final del artículo.Gravedad Entero que indica el nivel de gravedad del error. Esta definido en el

rango de 1 a 25, si bien los códigos de gravedad entre 19 y 25, solopueden ser utilizados por el administrador del sistema, al constituiréstos, errores fatales.

Estado Entero en el rango de 1 a 127, para la definición de subestados deerror. Si no se utiliza se establece un valor de -1

lista_de_Argumentos Lista de valores que se sustituirán en la cadena de mensaje. Han decoincidir en posición y tipo.

Argumentos de sustitución

La sintaxis del argumento es la siguiente:

%[[flag][ancho][precision][{h|i}]]Tipo

Donde:

flag Determina el espaciado y el ajuste dentro de ancho. Los valores son:

Page 8: 10325656 Procedimientos Almacenados y Triggers en SQL Server

8Algoritmo . La revista para el programador de sistemas de bases de datos. http://www.eidos.es - © Grupo EIDOS

Valores- Menos Ajuste a la izquierda+- Signo Antepone el signo0 Cero añade ceros# Antepone # a valores octales, y hexadecimales‘ ‘ Blanco Antepone un blanco si con signo y positivo

ancho Define la anchura mínima.

precision Especifica el número máximo de caracteres o el mínimo de dígitos.

{h|i}Tipo Si h precede al tipo se crea un entero corto, si es i quien lo precede, elentero es largo.

Tipo Significadod,i Entero con signoo Octal sin signop Punteros Cadenau Entero sin signox,X Hexadecimal sin signo

Errores almacenados en sysmessages

Para guardar mensaje en sysmessages que puedan ser accedidos posteriormente conRAISERROR, utilizaremos el procedimiento almacenado del sistema sp_addmessage.

La sintaxis es la siguiente:

sp_addmessage id_msg,gravedad,mensaje[,idioma[,true|false[,REPLACE]]]

Donde:

id_msg Código asignado al mensaje.gravedad Nivel de gravedad asignado al mensaje.mensaje Texto del mensaje definido como se ha explicado anteriormente.idioma Idioma empleado en la confección del mensaje. Si no se especifica se

asume Ingles U.S.{true|false} Especifica si el mensaje se grabará el LOG de eventos de Windows NT.

Si se graba en LOG de eventos de Windows NT también se graba en elLOG de errores de SQL Server.

REPLACE Si existe ya el mensaje en sysmessages, se actualiza con la nuevainformación.