P. 1
10325656 Procedimientos Almacenados y Triggers en SQL Server

10325656 Procedimientos Almacenados y Triggers en SQL Server

|Views: 0|Likes:
Published by LuisFelipeUNI

More info:

Published by: LuisFelipeUNI on Jan 30, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/30/2013

pdf

text

original

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. Parámetros definidos en el procedimiento con la siguiente sintaxis:

Lista_de_parámetros

@nombre_var

Tipo_var

[OUTPUT]

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

se devuelve el código cuyo valor absoluto es mayor. Ejemplos Como base de datos de trabajo para los ejemplos se a utilizado SOPORTEDB cuya estructura es accesible por todos. De la misma forma los definidos por el usuario tiene prioridad sobre los definidos por el sistema. RETURN [Valor] Un procedimiento almacenado puede devolver un valor de retorno de tipo integer.© Grupo EIDOS . viene a ser un parámetro pasado por referencia. depende de como se halla creado dicho procedimiento.es . se especifica la llamada al mismo. 2 Algoritmo. el cuerpo del procedimiento puede estar compuesto de cualquier tipo de instrucción SQL.eidos.El símbolo @ es necesario no sólo en la declaración sino que forma parte del propio nombre. Algunos ejemplos de códigos y sus significados son los siguientes: Código -2 -4 -5 -13 Significado Error de tipo de datos Error de Permisos Error de Sintaxis Base de Datos Corrupta Llamadas a procedimientos almacenados La sintaxis de la llamada a un procedimiento almacenado. con lo cual no se detalla en este documento ningún elemento referente a dicha estructura. es decir. que puede ser rescatado por el código llamador para tener conocimiento del resultado del proceso de dicho procedimiento. por lo que en cada uno de los ejemplos que siguen. los cuales podrán acceder a los objetos pertenecientes al llamador. En caso de producirse varios errores a lo largo de la ejecución del mismo procedimiento. está la llamada a otros procedimientos almacenados. poniéndose de manifiesto dicha sintaxis en cada caso particular. así como el 0 que se interpreta como “finalizado con éxito”. http://www. Si no se proporciona un código definido por el usuario. a excepción de las siguientes: CREATE VIEW CREATE DEFAULT CREATE RULE CREATE PROCEDURE CREATE TRIGGER Entre las instrucciones que puede contener. se utilizan los del sistema. no nulo. exceptuando las tablas temporales creadas por el mismo. Sentencias_SQL Como se explicó anteriormente. La revista para el programador de sistemas de bases de datos. La claúsula OUPUT determina que dicho parámetro será utilizado para pasar información al código llamador. Dicha lista puede contener un máximo de 255 parámetros. Los valores -1 al -99 están reservados por el sistema.

sin parámetros que devuelve un conjunto de filas que cumplen siempre la misma condición.© Grupo EIDOS . CREATE PROCEDURE prod_2 @p_CodIni CHAR (6). @p_CodFin CHAR (6) AS SELECT * FROM CLIENTE WHERE IDCLIENTE BETWEEN @p_CodIni AND @p_CodFin Llamada: EXECUTE prod_2 ‘000100’. correspondientes a un rango de códigos de clientes. CREATE PROCEDURE prod_3 @p_CodTipProd CHAR (3). el número de productos existentes. El parámetro de entrada corresponde a un código de tipo de producto y el de salida. La revista para el programador de sistemas de bases de datos. http://www. ‘000500’ Procedimiento 3 Es un procedimiento que recibe un parámetro de entrada y uno de salida. que corresponden a dicho tipo.es .Procedimiento 1 Es un procedimiento simple.eidos. CREATE PROCEDURE prod_1 AS SELECT * FROM CLIENTES Llamada: EXECUTE prod_1 Procedimiento 2 Es un procedimiento que recibe dos parámetros de entrada. @p_NumProductos SMALLINT OUTPUT AS SELECT @p_NumProductos = COUNT(*) 3 Algoritmo. y devuelve el conjunto de filas de la tabla CLIENTES cuyo código se encuentra en el rango determinado por los parámetros.

es la de asegurar la integridad referencial o el cumplimiento de las distintas reglas definidas.© Grupo EIDOS .es . Las operaciones que pueden “disparar” un trigger son las correspondientes a las instrucciones SQL. o añadidas posteriormente. La mayor utilidad que se confiere a un trigger. Puede definirse un trigger para cada una de ellas. incide de forma negativa en cuanto al rendimiento se refiere. INSERT. http://www. definidas durante la creación de las tablas. si bien estas son operaciones que pueden delegarse en el propio servidor. es el número de filas insertadas. 4 Algoritmo.FROM PRODUCTOS WHERE IDTIPROD = @p_CodTipProd Llamada: DECLARE @p_parmsal SMALLINT EXECUTE prod_3 ‘KBD’. @p_parmsal OUTPUT Procedimiento 4 Es un procedimiento almacenado que realiza inserciones en una tabla.eidos. El valor devuelto por el procedimiento almacenado. si bien la mayor parte del tiempo empleado en su ejecución corresponde al acceso a las diferentes tablas implicadas en los chequeos de integridad. con los valores devueltos por un subquery realizado sobre otra tabla que tiene la misma estructura. El hecho de tener algún trigger asociado a una tabla. CREATE PROCEDURE prod_4 AS INSERT TIPSOPPRU SELECT * FROM TIPSOPORTE RETURN @@ROWCOUNT Llamada: DECLARE @p_retorno INTEGER EXECUTE @p_retorno = prod_4 Triggers Un trigger es un tipo especial de procedimiento almacenado que se ejecuta automáticamente al intentarse efectuar una modificación de los datos. o bien definir un trigger asociado a una combinación de las mismas. mediante las instrucciones y cláusulas de especificación de las reglas de integridad. La revista para el programador de sistemas de bases de datos. UPDATE y DELETE. en la tabla a la que se encuentran asociados.

las herramientas disponibles son las mismas que en el caso de los procedimientos almacenados.© Grupo EIDOS . La instrucción que permite la creación de un trigger es CREATE TRIGGER.DELETE} AS (Sentecias_SQL) Donde: Nombre_del_Trigger: Identificador que determina el nombre del trigger en la base de datos y que debe cumplir las reglas de construcción de identificadores en SQL Server. y su sintaxis es la siguiente: CREATE TRIGGER Nombre_del_Trigger ON Nombre_de_la_tabla FOR {INSERT. tal activación no se producirá. Aunque desde el trigger pueden referenciarse objetos de otras bases de datos. Instrucción de actualización de filas. Instrucción de inserción de filas. Nombre de la tabla sobre la que será ejecutado el trigger. La revista para el programador de sistemas de bases de datos.eidos. ésta deberá ser la primera y sólo puede ser aplicada sobre una tabla. Instrucción de eliminación de filas. http://www. provoca la sustitución inmediata y sin aviso. del anterior. a excepción de las siguientes: • • • • • Cualquier instrucción CREATE Cualquier instrucción DROP ALTER TABLE y ALTER DATABASE SELECT INTO GRANT y REVOKE Nombre_de_la_tabla INSERT UPDATE DELETE Sentencias_SQL En el caso en que la instrucción CREATE TRIGGER forme parte de un conjunto de instrucciones (Batch). realice una actualización que provoque la activación del mismo. El intento de crear un trigger sobre un trigger ya existente. si bien deberán utilizarse las opciones correspondientes. Con relación a las transacciones hay que decir que en el caso de comenzarse una transacción y activarse un trigger que contenga y ejecute el comando ROLLBACK TRANSACTION. Cualquier tipo de sentencia SQL. se acabará producción un error de desbordamiento del nivel de anidamiento. éste deshará la transacción completa iniciada antes de su activación. En caso de que un trigger caiga en un bucle infinito. Los triggers no son reentrantes lo que quiere decir que en caso de que un trigger en ejecución. éste sólo puede se creado en la base de datos en curso. en cuanto a datos se refiere.UPDATE. en caso de ser ésta alterada.En relación a la creación de los triggers. Los triggers pueden ser anidados y permiten un nivel máximo de anidamiento de 16. 5 Algoritmo.es .

IDPROVIN = CPOSTAL.IDPROVIN AND CLI.IDPROVIN. La revista para el programador de sistemas de bases de datos. se define un trigger que impida tal hecho. Trigger 1 La tabla CPOSTALES no está sometida a ningún control de integridad referencial.es .-1) END Trigger 2 Partiendo de la tabla del ejemplo 1.16.RESTCDPOSTAL WHERE CLIENTES 6 Algoritmo. estableceremos un trigger que efectúe una actualización en cascada.Otra de las mayores utilidades de los triggers es deshacer transacciones iniciadas antes de su activación.RESTCDPOSTAL IF @p_cuenta > 1 BEGIN UPDATE CLIENTES SET CLIENTES.IDPROVIN = updated.RESTCDPOSTAL = CPOSTAL. con lo cual para evitar eliminar una fila que tenga una referencia en la tabla CLIENTES. CREATE TRIGGER Trig_2 ON CPOSTAL FOR UPDATE AS DECLARE @p_cuenta SMALLINT SELECT @p_cuenta = COUNT(*) FROM CLIENTES CLI WHERE CLI.© Grupo EIDOS . http://www. suponemos que ésta ha sido previamente iniciada en el procedimiento principal. Dado que la acción a realizar es deshacer una transacción.RESTCDPOSTAL = updated. Ejemplos Seguidamente se muestran algunos ejemplos de triggers.RESTCDPOSTAL = CPOSTAL.RESTCDPOSTAL IF @p_cuenta > 1 BEGIN ROLLBACK TRANSACTION RAISERROR(‘ESTA FILA CONTIENE REFERENCIAS EN TABLA CLIENTES’.IDPROVIN = CPOSTAL. CREATE TRIGGER Trig_1 ON CPOSTAL FOR DELETE AS DECLARE @p_cuenta SMALLINT SELECT @p_cuenta = COUNT(*) FROM CLIENTES CLI WHERE CLI. en el supuesto de intentar modificar un código postal que contenga referencias en la tabla Cliente. CLIENTES. como consecuencia de un error detectado durante su ejecución.eidos.IDPROVIN AND CLI.

Para los errores definidos en tiempo de ejecución. este código es asignado automáticamente por el sistema y es igual a 50000. Han de coincidir en posición y tipo. solo pueden ser utilizados por el administrador del sistema. debido a que el resto están reservados por el sistema. -1) END Función RaiseError Esta función es utilizada para comunicar errores al cliente. Numérico mayor que 50000. estado. Entero que indica el nivel de gravedad del error. y otros valores añadidos que se comentarán más adelante. La sintaxis de esta función es la siguiente: RAISERROR (id_msg|str_msg.eidos. http://www. Esta definido en el rango de 1 a 25. al constituir éstos. un literal. 16. pueden residir en una tabla especial de la base de datos. Los errores definidos por el usuario deben tener un código no inferior a 50001.RAISERROR (‘FILAS ACTUALIZADAS EN TABLA CLIENTES’. La revista para el programador de sistemas de bases de datos. Los valores son: 7 Algoritmo. guarda semejanza a la utilizada por la función Printf del lenguaje C. errores fatales. La forma en que se especifican éstos y sus tipos. La cadena que constituye el mensaje propiamente dicho. esto es parámetros.es . La declaración de variables de sustitución se detalla al final del artículo. si bien los códigos de gravedad entre 19 y 25. lista_de_argumentos) Donde: id_msg Str_msg Gravedad Estado lista_de_Argumentos Código identificativo del mensaje. Cada error tiene asociado un código numérico de 5 dígitos. definidos por el programador.© Grupo EIDOS . Entero en el rango de 1 a 127. Los mensajes correspondientes a estos errores. Cadena que constituye el mensaje. o bien pueden ser creados en tiempo de ejecución. llamada sysmessages. Si no se utiliza se establece un valor de -1 Lista de valores que se sustituirán en la cadena de mensaje. gravedad. para la definición de subestados de error. puede contener argumentos de sustitución. 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.

X Significado Entero con signo Octal sin signo Puntero Cadena Entero sin signo Hexadecimal sin signo Errores almacenados en sysmessages Para guardar mensaje en sysmessages que puedan ser accedidos posteriormente con RAISERROR. Nivel de gravedad asignado al mensaje. Especifica el número máximo de caracteres o el mínimo de dígitos.© Grupo EIDOS .idioma[. 8 Algoritmo. Si existe ya el mensaje en sysmessages. Texto del mensaje definido como se ha explicado anteriormente. el entero es largo. se actualiza con la nueva información. utilizaremos el procedimiento almacenado del sistema sp_addmessage. Si h precede al tipo se crea un entero corto.i o p s u x. La revista para el programador de sistemas de bases de datos.REPLACE]]] id_msg gravedad mensaje idioma {true|false} REPLACE Código asignado al mensaje. Si no se especifica se asume Ingles U. y hexadecimales Antepone un blanco si con signo y positivo ancho precision {h|i}Tipo Define la anchura mínima.mensaje[. Si se graba en LOG de eventos de Windows NT también se graba en el LOG de errores de SQL Server.es . La sintaxis es la siguiente: sp_addmessage Donde: id_msg. Idioma empleado en la confección del mensaje.eidos.gravedad. http://www. si es i quien lo precede.Valores +0 # ‘‘ Menos Signo Cero Blanco Ajuste a la izquierda Antepone el signo añade ceros Antepone # a valores octales.S.true|false[. Especifica si el mensaje se grabará el LOG de eventos de Windows NT. Tipo d.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->