You are on page 1of 7

PROCEDIMIENTOS ALMACENADOS

Un procedimiento almacenado es una consulta que se almacena en una base de


datos en SQL Server en lugar de almacenarse en el cdigo cliente (normalmente
C# o Java) en el equipo cliente. Esto para optimizar la insercin y obtencin de
datos.
La instruccin general para crear procedimientos almacenados es la siguiente:
CREATE PROC nombre_proc
parmetros
AS
INSTRUCCION SQL
Es necesario aclarar, que un procedimiento almacenado puede recibir parmetros
de entrada y devolver parmetros de salida. Por Ejemplo:
Instruccin SQL
USE AdventureWorks
Select name, Color, ListPrice, SellStartDate
FROM Production.Product
WHERE SellStartDate > '1/1/2003'
ORDER BY SellStartDate, Name
Procedimiento con la instruccin anterior
CREATE PROCEDURE PROCE1#CARNET
AS
Select name, Color, ListPrice, SellStartDate
FROM Production.Product
WHERE SellStartDate > '1/1/2003'
ORDER BY SellStartDate, Name
GO
Para ejecutar este procedimiento se utiliza la expresin exec
EXEC PROCE1#CARNET

COMPONENTES
CREATE PROCEDURE: Define que se escribir un procedimiento.
Nombre_proc: Es el nombre clave del procedimiento para su ejecucin.
Parmetros: Datos que se usaran dentro de la instruccin SQL, deben
empezar con un smbolo @ e incluir el tipo de dato a recibir.
AS: Define el comienzo de la instruccin SQL a utilizar en el procedimiento
GO: Declara la terminacin del procedimiento
Tambin se pueden agregar mecanismos de control de flujo para hacer ms
definido el proceso tales como los siguientes:

PRINT
Es una instruccin para imprimir un dato en la pantalla
RAISERROR:
Es similar a PRINT, pero permite especificar un nmero de error y la severidad del
mensaje. RAISERROR tambin permite que los errores se registren en el servicio
de sucesos de Windows NT haciendo posible leerlos a travs del visor de sucesos
de Windows NT.
La sintaxis es:
RAISERROR ({id_mensaje | cadena_mensaje}, severidad, estado [,
argumento1 [,argumento2]]) WITH LOG.
Despus de llamar a RAISERROR, la variable global @@ERROR tendr el valor
de
id_mensaje, si no se pasa ningn id_mensaje, asumir 5000.

EJEMPLO DE USO:
CREATE PROCEDURE ingreso
@apellido varchar(15), @nombre varchar(15)
AS
DECLARE @nom varchar(15)-variable local
DECLARE @ape varchar(15)-variable local
--revisamos que las variables no sean nulas
--PRIMER IF EXTERNO si las variables son diferentes de null entra al if
--de lo contario sale y mande que no pueden ser valores nulos
IF((@nombre<>'') AND (@apellido<>''))
BEGIN
--guardamos el nombre y el apellido en las variables locales @non
y @ape
SELECT @nom=firstname, @ape=lastname from member where
firstname=@nombre and lastname=@apellido
--IF INTERNO comparamos el valor capturado en @nom y @ape y
los comparamos
--con los parmetros de entrada
IF((@nom=@nombre) AND (@ape=@apellido))
BEGIN
PRINT 'EL USUARIO YA EXISTE EN LA BASE DE
DATOS'
RETURN
END--END DEL IF INTERNO
ELSE--ELSE DEL IF INTERNO
BEGIN
INSERT INTO member(lastname,firstname)
values(@apellido, @nombre)
PRINT 'EL REGISTRO SE HA INGRESADO
CORRECTAMENTE'
END--END DEL ELSE INTERNO
END--END DEL IF EXTERNO
ELSE--ELSE DEL IF EXTERNO
BEGIN
PRINT 'NO SE PUEDEN INGRESAR VALORES NULOS'
RETURN
END--END DEL ELSE EXTERNO

TRIGGERS
Un disparador (trigger o desencadenador) es una clase especial de
procedimiento almacenado que se ejecuta automticamente cuando se
produce un evento en el servidor de bases de datos.
SQL Server proporciona los siguientes tipos de triggers:
Trigger DML, se ejecutan cuando un usuario intenta modificar datos
mediante un evento de lenguaje de manipulacin de datos (DML). Los eventos
DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.
Trigger DDL, se ejecutan en respuesta a una variedad de eventos de
lenguaje de definicin de datos (DDL). Estos eventos corresponden
principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a
determinados procedimientos almacenados del sistema que ejecutan
operaciones de tipo DDL.
Trigger LOGON, se activan en respuesta al evento LOGON que se genera
cuando se establece la sesin de un usuario con una instancia SQL Server.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <nombre_trigger>
ON <ALL SERVER> | <DATABASE>>
FOR | AFTER
< CREATE > , < ALTER > , < DROP >
AS
BEGIN
sql_statement
..
END

COMPONENTES
AFTER, especfica que el desencadenador solo se activa cuando todas las
operaciones especificadas en la instruccin SQL desencadenadora se han
ejecutado correctamente. Adems, todas las acciones referenciales en cascada
y las comprobaciones de restricciones deben ser correctas para que este
desencadenador se ejecute.
FOR, la especificacin de AFTER produce el mismo efecto que especificar
FOR, que es la
nica opcin disponible en las versiones anteriores de Microsoft SQL Server
ALL SERVER, aplica el mbito de un desencadenador DDL o logon al servidor
actual. Si se especifica, el desencadenador se activa cada vez que event_type
tienen lugar en la base de datos actual.
DATABASE, aplica el mbito de un desencadenador DDL a la base de datos
actual. Si se especifica, el desencadenador se activa cada vez que event_type
tienen lugar en la base de datos actual.

OPCIONES DE TRIGGERS
Activacin/Desactivacin de Trigger de una tabla.
Desactiva un trigger
o DISABLE TRIGGER <nombre_trigger> ON <nombre_tabla>
Activa un trigger
o ENABLE TRIGGER <nombre_trigger>ON <nombre_tabla>
Desactiva todos los trigger
o ALTER TABLE <nombre_tabla>DISABLE TRIGGER ALL
Activa todos los trigger
o ALTER TABLE <nombre_tabla> ENABLE TRIGGER ALL
Borrar Trigger de una tabla.
o Borrar Trigger DML
DROP TRIGGER <nombre_trigger>
o Borrar Trigger DDL
DROP TRIGGER <nombre_trigger> ON {DATABASE | ALL
SERVER}
o Borrar Trigger LOGON
DROP TRIGGER <nombre_tabla> ON ALL SERVER

EJEMPLOS

1) Ejemplo trigger DDL, imprime un mensaje en el cliente cuando alguien


intenta agregar o cambiar datos en la tabla Customer.
USE Agenda
GO
CREATE TRIGGER VALIDADOR
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
PRINT 'CREATE TABLE .....'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)
[1]','nvarchar(max)')
RAISERROR ('No se pueden crear tablas en la base de datos.', 16, 1)
ROLLBACK
END
2) Ejemplo trigger DML, imprime un mensaje en el cliente cuando alguien
intenta agregar o cambiar datos en la tabla cargo.
USE Agenda
GO
CREATE TRIGGER reminder1 ON cargo
AFTER INSERT, UPDATE
AS
BEGIN
RAISERROR ('No puede insertar ni modificar esta tabla', 16, 10)
END
3) Ejemplo trigger LOGON, que valida que no hallan ms de 3 sesiones de
un mimo usuario. Verificar versin de SQL (select @@version)
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf'
MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger ON ALL SERVER
WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test'
AND (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process =
1 AND
original_login_name = 'login_test') > 3 ROLLBACK;
END

Bibliografa
Base de Datos 1: Gua 9; PROCEDIMIENTOS ALMACENADOS;
http://www.udb.edu.sv/udb/archivo/guia/informatica-ingenieria/base-de-datosi/2013/i/guia-9.pdf
Fierro Sez , Ariel Alexis; SQL SERVER APLICADO; DuocUC;
http://ssa010.files.wordpress.com/2012/06/cap9-triggers-transac-sql2.pdf

You might also like