Está en la página 1de 8

Procedimientos almacenados y

Triggers en SQL Server 6.5


Por Fernando Gonzlez

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:

CREATE PROCEDURE Nombre_del_procedimiento


[Lista_de_parmetros]
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 definicin de identificadores
establecida en MSSQL Server.

Lista_de_parmetros Parmetros definidos en el procedimiento con la siguiente


sintaxis:

@nombre_var Tipo_var [OUTPUT]

1
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
El smbolo @ es necesario no slo en la declaracin sino que
forma parte del propio nombre. La clasula OUPUT determina
que dicho parmetro ser utilizado para pasar informacin al
cdigo llamador, es decir, viene a ser un parmetro pasado por
referencia.

Dicha lista puede contener un mximo de 255 parmetros.

Sentencias_SQL Como se explic anteriormente, el cuerpo del procedimiento


puede estar compuesto de cualquier tipo de instruccin SQL, a
excepcin de las siguientes:

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] Un procedimiento almacenado puede devolver un valor de


retorno de tipo integer, no nulo, que puede ser rescatado por el
cdigo llamador para tener conocimiento del resultado del
proceso de dicho procedimiento. Los valores -1 al -99 estn
reservados por el sistema, as como el 0 que se interpreta como
finalizado con xito. Si no se proporciona un cdigo definido
por el usuario, se utilizan los del sistema. De la misma forma los
definidos por el usuario tiene prioridad sobre los definidos por el
sistema. En caso de producirse varios errores a lo largo de la
ejecucin del mismo procedimiento, se devuelve el cdigo cuyo
valor absoluto es mayor. Algunos ejemplos de cdigos y sus
significados son los siguientes:

Cdigo 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 creado
dicho procedimiento, por lo que en cada uno de los ejemplos que siguen, se especifica la
llamada al mismo, ponindose de manifiesto dicha sintaxis en cada caso particular.

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.

CREATE PROCEDURE prod_1


AS
SELECT * FROM CLIENTES

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.

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, 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.

CREATE PROCEDURE prod_3


@p_CodTipProd CHAR (3),
@p_NumProductos SMALLINT OUTPUT
AS
SELECT @p_NumProductos = COUNT(*)

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:

DECLARE @p_parmsal SMALLINT


EXECUTE prod_3 KBD, @p_parmsal OUTPUT

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.

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 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:

CREATE TRIGGER Nombre_del_Trigger


ON Nombre_de_la_tabla
FOR {INSERT,UPDATE,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 construccin de
identificadores en SQL Server.

Nombre_de_la_tabla Nombre de la tabla sobre la que ser ejecutado el trigger, en


caso de ser sta alterada, en cuanto a datos se refiere.

INSERT Instruccin de insercin de filas.

UPDATE Instruccin de actualizacin de filas.

DELETE Instruccin de eliminacin de filas.

Sentencias_SQL Cualquier tipo de sentencia SQL, a excepcin de las


siguientes:

Cualquier instruccin CREATE


Cualquier instruccin DROP
ALTER TABLE y ALTER DATABASE
SELECT INTO
GRANT y REVOKE

En el caso en que la instruccin CREATE TRIGGER forme parte de un conjunto de


instrucciones (Batch), sta deber ser la primera y slo puede ser aplicada sobre una tabla.

Aunque desde el trigger pueden referenciarse objetos de otras bases de datos, ste slo puede
se creado en la base de datos en curso.

El intento de crear un trigger sobre un trigger ya existente, provoca la sustitucin inmediata y


sin aviso, del anterior.

Los triggers pueden ser anidados y permiten un nivel mximo de anidamiento de 16. En caso
de que un trigger caiga en un bucle infinito, se acabar produccin un error de desbordamiento
del nivel de anidamiento.

Los triggers no son reentrantes lo que quiere decir que en caso de que un trigger en ejecucin,
realice una actualizacin que provoque la activacin del mismo, tal activacin no se producir.

Con relacin a las transacciones hay que decir que en el caso de comenzarse una transaccin
y activarse un trigger que contenga y ejecute el comando ROLLBACK TRANSACTION, ste
deshar la transaccin completa iniciada antes de su activacin.

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.

CREATE TRIGGER Trig_1


ON CPOSTAL
FOR DELETE
AS
DECLARE @p_cuenta SMALLINT
SELECT @p_cuenta = COUNT(*)
FROM CLIENTES CLI
WHERE CLI.IDPROVIN = CPOSTAL.IDPROVIN AND
CLI.RESTCDPOSTAL = CPOSTAL.RESTCDPOSTAL
IF @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 efecte una actualizacin
en cascada, en el supuesto de intentar modificar un cdigo postal que contenga referencias en
la tabla Cliente.

CREATE TRIGGER Trig_2


ON CPOSTAL
FOR UPDATE
AS
DECLARE @p_cuenta SMALLINT
SELECT @p_cuenta = COUNT(*)
FROM CLIENTES CLI
WHERE CLI.IDPROVIN = CPOSTAL.IDPROVIN AND
CLI.RESTCDPOSTAL = CPOSTAL.RESTCDPOSTAL

IF @p_cuenta > 1
BEGIN
UPDATE CLIENTES
SET CLIENTES.IDPROVIN = updated.IDPROVIN,
CLIENTES.RESTCDPOSTAL = updated.RESTCDPOSTAL
WHERE CLIENTES

6
Algoritmo. 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

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:

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

Donde:

id_msg Cdigo identificativo del mensaje. Numrico mayor que 50000.


Str_msg Cadena que constituye el mensaje. La declaracin de variables de
sustitucin se detalla al final del artculo.
Gravedad Entero que indica el nivel de gravedad del error. Esta definido en el
rango de 1 a 25, si bien los cdigos de gravedad entre 19 y 25, solo
pueden ser utilizados por el administrador del sistema, al constituir
stos, errores fatales.
Estado Entero en el rango de 1 a 127, para la definicin de subestados de
error. Si no se utiliza se establece un valor de -1
lista_de_Argumentos Lista de valores que se sustituirn en la cadena de mensaje. Han de
coincidir en posicin y tipo.

Argumentos de sustitucin
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:

7
Algoritmo. 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 signo
0 Cero aade ceros
# Antepone # a valores octales, y hexadecimales
Blanco Antepone un blanco si con signo y positivo

ancho Define la anchura mnima.

precision Especifica el nmero mximo de caracteres o el mnimo de dgitos.

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


entero es largo.

Tipo Significado
d,i Entero con signo
o Octal sin signo
p Puntero
s Cadena
u Entero sin signo
x,X Hexadecimal sin signo

Errores almacenados en sysmessages


Para guardar mensaje en sysmessages que puedan ser accedidos posteriormente con
RAISERROR, 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 Cdigo 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 confeccin 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 tambin se graba en el
LOG de errores de SQL Server.
REPLACE Si existe ya el mensaje en sysmessages, se actualiza con la nueva
informacin.

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

También podría gustarte