Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Procedimientos Almacenados y Triggers en SQL Server
Procedimientos Almacenados y Triggers en SQL Server
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 manipulacin de datos, como de
control de la secuencia del programa, asociados a un nombre, y que son ejecutados en
conjunto. Puede contener parmetros tanto de entrada como de salida (parmetros 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 recompilacin.
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 cachs del servidor. Al mismo tiempo al ser cdigo externo a la aplicacin puede ser
alterado sin que exista siempre la necesidad de modificar el cdigo 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 realizacin de
distintas tareas de administracin.
Un procedimiento almacenado se crea con la sentencia CREATE PROCEDURE, que debe ser
la nica dentro de un mismo batch. La creacin de un procedimiento almacenado puede ser
realizada bien desde el ISQL_W, bien desde la opcin 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 instruccin es bsicamente la siguiente:
Nombre_del_procedimiento
Lista_de_parmetros
@nombre_var
Tipo_var
[OUTPUT]
1
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
Sentencias_SQL
CREATE VIEW
CREATE DEFAULT
CREATE RULE
CREATE PROCEDURE
CREATE TRIGGER
Entre las instrucciones que puede contener, est la llamada a
otros procedimientos almacenados, los cuales podrn acceder a
los objetos pertenecientes al llamador, exceptuando las tablas
temporales creadas por el mismo.
RETURN [Valor]
Cdigo
-2
-4
-5
-13
Significado
Error de tipo de datos
Error de Permisos
Error de Sintaxis
Base de Datos Corrupta
Ejemplos
Como base de datos de trabajo para los ejemplos se a utilizado SOPORTEDB cuya estructura
es accesible por todos, con lo cual no se detalla en este documento ningn elemento referente
a dicha estructura.
2
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
Procedimiento 1
Es un procedimiento simple, sin parmetros que devuelve un conjunto de filas que cumplen
siempre la misma condicin.
Llamada:
EXECUTE prod_1
Procedimiento 2
Es un procedimiento que recibe dos parmetros de entrada, correspondientes a un rango de
cdigos de clientes, y devuelve el conjunto de filas de la tabla CLIENTES cuyo cdigo se
encuentra en el rango determinado por los parmetros.
Llamada:
EXECUTE
prod_2
000100,
000500
Procedimiento 3
Es un procedimiento que recibe un parmetro de entrada y uno de salida. El parmetro de
entrada corresponde a un cdigo de tipo de producto y el de salida, el nmero de productos
existentes, que corresponden a dicho tipo.
3
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
FROM PRODUCTOS
WHERE IDTIPROD = @p_CodTipProd
Llamada:
Procedimiento 4
Es un procedimiento almacenado que realiza inserciones en una tabla, con los valores
devueltos por un subquery realizado sobre otra tabla que tiene la misma estructura. El valor
devuelto por el procedimiento almacenado, es el nmero de filas insertadas.
Llamada:
DECLARE
@p_retorno INTEGER
EXECUTE @p_retorno = prod_4
Triggers
Un trigger es un tipo especial de procedimiento almacenado que se ejecuta automticamente
al intentarse efectuar una modificacin de los datos, en la tabla a la que se encuentran
asociados.
Las operaciones que pueden disparar un trigger son las correspondientes a las instrucciones
SQL, INSERT, UPDATE y DELETE.
Puede definirse un trigger para cada una de ellas, o bien definir un trigger asociado a una
combinacin de las mismas.
La mayor utilidad que se confiere a un trigger, es la de asegurar la integridad referencial o el
cumplimiento de las distintas reglas definidas, si bien estas son operaciones que pueden
delegarse en el propio servidor, mediante las instrucciones y clusulas de especificacin de las
reglas de integridad, definidas durante la creacin de las tablas, o aadidas posteriormente.
El hecho de tener algn trigger asociado a una tabla, incide de forma negativa en cuanto al
rendimiento se refiere, si bien la mayor parte del tiempo empleado en su ejecucin
corresponde al acceso a las diferentes tablas implicadas en los chequeos de integridad.
4
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
En relacin a la creacin de los triggers, las herramientas disponibles son las mismas que en el
caso de los procedimientos almacenados, si bien debern utilizarse las opciones
correspondientes.
La instruccin que permite la creacin de un trigger es CREATE TRIGGER, y su sintaxis es la
siguiente:
Nombre_del_Trigger:
Nombre_de_la_tabla
INSERT
UPDATE
DELETE
Sentencias_SQL
5
Algoritmo. 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 su
activacin, como consecuencia de un error detectado durante su ejecucin.
Ejemplos
Seguidamente se muestran algunos ejemplos de triggers.
Trigger 1
La tabla CPOSTALES no est sometida a ningn control de integridad referencial, con lo cual
para evitar eliminar una fila que tenga una referencia en la tabla CLIENTES, se define un
trigger que impida tal hecho. Dado que la accin a realizar es deshacer una transaccin,
suponemos que sta ha sido previamente iniciada en el procedimiento principal.
Trigger 2
Partiendo de la tabla del ejemplo 1, estableceremos un trigger que efecte una actualizacin
en cascada, en el supuesto de intentar modificar un cdigo postal que contenga referencias en
la tabla Cliente.
Funcin RaiseError
Esta funcin es utilizada para comunicar errores al cliente, definidos por el programador.
Los mensajes correspondientes a estos errores, pueden residir en una tabla especial de la
base de datos, llamada sysmessages, o bien pueden ser creados en tiempo de ejecucin.
Cada error tiene asociado un cdigo numrico de 5 dgitos, un literal, y otros valores aadidos
que se comentarn ms adelante.
Los errores definidos por el usuario deben tener un cdigo no inferior a 50001, debido a que el
resto estn reservados por el sistema.
Para los errores definidos en tiempo de ejecucin, este cdigo es asignado automticamente
por el sistema y es igual a 50000.
La cadena que constituye el mensaje propiamente dicho, puede contener argumentos de
sustitucin, esto es parmetros.
La forma en que se especifican stos y sus tipos, guarda semejanza a la utilizada por la
funcin Printf del lenguaje C.
La sintaxis de esta funcin es la siguiente:
id_msg
Str_msg
Gravedad
Estado
lista_de_Argumentos
Argumentos de sustitucin
La sintaxis del argumento es la siguiente:
%[[flag][ancho][precision][{h|i}]]Tipo
Donde:
flag
7
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
Valores
+0
#
Menos
Signo
Cero
Blanco
Ajuste a la izquierda
Antepone el signo
aade ceros
Antepone # a valores octales, y hexadecimales
Antepone un blanco si con signo y positivo
ancho
precision
{h|i}Tipo
Tipo
d,i
o
p
s
u
x,X
Significado
Entero con signo
Octal sin signo
Puntero
Cadena
Entero sin signo
Hexadecimal sin signo
sp_addmessage
id_msg,gravedad,mensaje[,idioma[,true|false[,REPLACE]]]
Donde:
id_msg
gravedad
mensaje
idioma
{true|false}
REPLACE
8
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS