Stored Procedures SQL Server
Stored Procedures SQL Server
Integridad de datos
SQL Server ofrece dos alternativas para asegurar la integridad de datos,
la integridad:
• Este tipo de restricción verifica los datos cada vez que se ejecuta una sentencia
"insert" o "update", es decir, actúa en inserciones y actualizaciones.
• Si la tabla contiene registros que no cumplen con la restricción que se va a
establecer, la restricción no se puede establecer, hasta que todos los registros
cumplan con dicha restricción.
• La condición puede hacer referencia a otros campos de la misma tabla.
Las condiciones para restricciones "check" también pueden pueden
incluir un patrón o una lista de valores. Por ejemplo establecer que
cierto campo conste de 4 caracteres, 2 letras y 2 dígitos:
CHECK (CAMPO like '[A-Z][A-Z][0-9][0-9]');
O establecer que cierto campo asuma sólo los valores que se listan:
CHECK (CAMPO in ('lunes','miercoles','viernes'));
No se puede aplicar esta restricción junto con la propiedad "identity".
Default
La restricción "default" especifica un valor por defecto para un campo cuando no se inserta explícitamente
en un comando "insert".
Anteriormente, para establecer un valor por defecto para un campo empleábamos la cláusula "default" al
crear la tabla, por ejemplo:
CREATE TABLE libros(
... autor VARCHAR(30) DEFAULT 'Desconocido', ... );
Cada vez que establecíamos un valor por defecto para un campo de una tabla, SQL Server creaba
automáticamente una restricción "default" para ese campo de esa tabla.
Podemos agregar una restricción "default" a una tabla existente con la sintaxis básica siguiente:
ALTER TABLE NombreTabla
ADD CONSTRAINT <Nombre_Constraint>
DEFAULT <ValorPorDefecto>
FOR Campo;
Stored Procedures
• Son un grupo de sentencias de T-SQL
• Aceptan parámetros de entrada y devuelven valores como parámetro
de salida.
• Contienen conjunto de instrucciones para realizar operaciones en la
base de datos. Permiten encapsular tareas repetitivas.
• Pueden incluir llamadas a otros SPs.
Beneficios
• Reduce el tráfico de red
• Fortalece la seguridad
• Reutilización de código
• Facilidad de mantenimiento al ser independiente de la aplicación
• Ayuda al rendimiento de la ejecución
Tipos de Stored Procedures
• Del sistema: están almacenados en la base de datos "master" y llevan el prefijo "sp_"; permiten
recuperar información de las tablas del sistema y pueden ejecutarse en cualquier base de datos.
• Locales: los crea el usuario (Los que veremos en el curso).
• Temporales: pueden ser locales, cuyos nombres comienzan con un signo numeral (#), o globales,
cuyos nombres comienzan con 2 signos numeral (##). Los procedimientos almacenados
temporales locales están disponibles en la sesión de un solo usuario y se eliminan
automáticamente al finalizar la sesión; los globales están disponibles en las sesiones de todos los
usuarios.
• Extendidos: se implementan como bibliotecas de vínculos dinámicos (DLL, Dynamic-Link
Libraries), se ejecutan fuera del entorno de SQL Server. Generalmente llevan el prefijo "xp_". No
los estudiaremos.
Un procedimiento almacenados puede hacer referencia a objetos que no existen al momento de
crearlo. Los objetos deben existir cuando se ejecute el procedimiento almacenado
Sintaxis Creación SP
CREATE PROCEDURE <Nombre>
-- Parámetros
<@Param1> Tipo de Dato= <Valor por Default>
<@Param1> Tipo de Dato= <Valor por Default>
…
AS
BEGIN
SET NOCOUNT ON;
-- sentencias T-SQL
-- Consultas
-- inserts
-- updates
-- deletes
…
END
Sintaxis Modificación SP
ALTER PROCEDURE <Nombre>
-- Parámetros
<@Param1> Tipo de Dato= <Valor por Default>
<@Param1> Tipo de Dato= <Valor por Default>
…
AS
BEGIN
SET NOCOUNT ON;
-- sentencias T-SQL
-- Consultas
--inserts
-- updates
-- deletes
…
END
Sintaxis Borrado SP
• Sp_helptext <Nombre>
• SELECT definition
FROM sys.sql_modules
WHERE object_id = ( OBJECT_ID (<Nombre>))
Ejecución
Sintaxis
1. nombre, tipo, campos, etc. de los objetos de los cuales depende el objeto
enviado y
2. nombre y tipo de los objetos que dependen del objeto nombrado. Por
ejemplo, ejecutamos "sp_depends" seguido del nombre de un
procedimiento:
exec sp_depends pa_autor_promedio;
aparecen las tablas (y demás objetos) de las cuales depende el procedimiento,
es decir, las tablas referenciadas en el mismo. Podemos ejecutar el
procedimiento seguido del nombre de una tabla:
exec sp_depends libros;
Aparecen los procedimientos (y demás objetos) que dependen de ella.
Try
Catch
Sintaxis
BEGIN TRY
{ sentencia T-SQL}
END TRY
BEGIN CATCH
[ {sentencia T-SQL}]
[RAISERROR]
END CATCH
Recuperar información de errores
• ERROR_NUMBER() – Devuelve el número interno del error
Sentencias T-SQL
INSERTED DELETED
INSERT, UPDATE DELETE,UPDATE
Trigger DML
CREATE TRIGGER Nombre
ON Tabla
{AFTER | INSTEAD OF}
{ [INSERT] [,] [UPDATE][,][DELETE]}
AS
BEGIN
Sentencias T-SQL
Uso de tablas
inserted, deleted
END
Trigger DML Ejemplo
ALTER TRIGGER ValidaFechaRegistro
ON Cliente
AFTER INSERT
AS
BEGIN
DECLARE @dtFechaRegistro DATETIME
SELECT @dtFechaRegistro = fecharegistro
FROM inserted
IF @dtFechaRegistro > GETDATE ()
BEGIN
RAISERROR (‘La fecha de registro del cliente no puede ser posterior al día de hoy’,16,1);
ROLLBACK TRANSACTION;
END;
END
Habilitar /Deshabilitar Trigger
-- Desactivar trigger
DISABLE TRIGGER nombre_trigger ON tabla
-- Activar trigger
ENABLE TRIGGER nombre_trigger de una tabla
-- Desactivar todos los trigger de una tabla
ALTER TABLE nombre_tabla DIABLE TRIGGER ALL
-- Activar todos los trigger de una tabla
ALTER TABLE nombre_tabla ENABLE TRIGGER ALL
Trigger DDL Creación
CREATE TRIGGER Nombre
ON {ALL SERVER | DATABASE}
{FOR | AFTER} {event_type | event_group}
AS
BEGIN
Sentencias T-SQL
END
Trigger DDL Ejemplo
CREATE TRIGGER seguridad
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
BEGIN
RAISERROR (‘Debe deshabilitar el trigger antes de poder realizar
una modificación’, 16,1);
ROLLBACK TRANSACTION;
END
Trigger Instead Off y After
También podemos especificar el momento de disparo del trigger. El momento de disparo indica
que las acciones (sentencias) del trigger se ejecuten luego de la acción (insert, delete o update)
que dispara el trigger o en lugar de la acción.
Sintaxis
CREATE TRIGGER Nombre
ON [Tabla | Vista]
{AFTER | INSTEAD OF} -- Momento de disparo DESPUÉS | EN LUGAR DE
{ [INSERT] [,] [UPDATE][,][DELETE]} -- Acción a ejecutar
AS
BEGIN
Sentencias T-SQL
Uso de tablas
inserted, deleted
END
a) "after": el trigger se dispara cuando las acciones especificadas (insert, delete
y/o update) son ejecutadas; todas las acciones en cascada de una restricción
"foreign key" y las comprobaciones de restricciones "check" deben
realizarse con éxito antes de ejecutarse el trigger. Es la opción por defecto si
solamente colocamos "for" (equivalente a "after").
b) "instead of": Se ejecutan en lugar de la acción desencadenante, es decir,
cancelan la acción desencadenante (suceso que disparó el trigger)
reemplazándola por otras acciones. Se puede definir solamente un
disparador de este tipo para cada acción (insert, delete o update) sobre una
tabla o vista.
Consideraciones
• Se pueden crear disparadores "instead of" en vistas y tablas.
• No se puede crear un disparador "instead of" en vistas definidas "with check option".
• No se puede crear un disparador "instead of delete" y "instead of update" sobre
tablas que tengan una "foreign key" que especifique una acción "on delete cascade"
y "on update cascade" respectivamente.
• No pueden crearse disparadores "after" en vistas ni en tablas temporales; pero
pueden referenciar vistas y tablas temporales.
• Si existen restricciones en la tabla del disparador, se comprueban DESPUÉS de la
ejecución del disparador "instead of" y ANTES del disparador "after". Si se infringen
las restricciones, se revierten las acciones del disparador "instead of"; en el caso del
disparador "after", no se ejecuta.