Sei sulla pagina 1di 37

Implementación de

Implementación
Base de Datos con
Microsoft SQL Server 2000
Parte IV

Ing. Martín Manuel Leiva Castillo


1
Ing. Jorge Martín Rodríguez Castro
Implementación de Procedimientos
Almacenados

1. Introducción a procedimientos almacenados


2. Creación de procedimientos almacenados
3. Usando parámetros
4. Ejecutando procedimientos almacenados
extendidos
5. Manejando mensajes de errores

2
Introducción a procedimientos almacenados

• Definiendo procedimientos almacenados


• Procesamiento inicial de procedimientos
almacenados
• Procesamiento subsecuente de
procedimientos almacenados
• Ventajas de procedimientos
almacenados
3
Procesamiento inicial de un procedimiento
almacenado
Creación
Entradas dentro de las tablas
Análisis sysobjects y syscomments

Ejecución
(primera vez
o
recompilado)
Optimización

Plan compilado localizado en la


Compilación caché de procedimientos

4
Ventajas de los procedimientos almacenados

• Compartir la lógica de la aplicación


• Permite una programación modular
• Protege detalles del esquema de base de
datos
• Puede utilizarse como mecanismo de
seguridad
• Permite una ejecución más rápida
• Puede reducir el tráfico de red
5
Creando, ejecutando y modificando
procedimientos almacenados

• Creando procedimientos almacenados


• Normas para la creación de procedimientos
almacenados
• Ejecutando procedimientos almacenados
• Modificando y eliminando procedimientos
almacenados

6
Creación de procedimientos almacenados

• Usar la sentencia CREATE PROCEDURE


USE Compañia
GO
CREATE PROCEDURE ListaEmpleados
AS
SELECT *
FROM Empleado

• Puede tener 32 niveles de anidamiento


• Usar sp_help para mostrar información

7
Normas para la creación de procedimientos
almacenados

• El usuario dbo debe ser el propietario de todos


los procedimientos almacenados
• Un procedimiento almacenado para una tarea
• Crear, probar y depurarlo en el servidor
• Evitar usar el prefijo sp_ en el nombre de los
procedimientos almacenados
• Usar la misma configuración de conexión para
todos los procedimientos almacenados
• Minimizar el uso de los procedimientos
almacenados temporales
8
Ejecución de procedimientos almacenados

• Ejecutando un procedimiento almacenado

EXEC ListaEmpleados

Ejecutando un procedimiento almacenados


dentro de una instrucción INSERT
INSERT INTO Empleados1
EXEC ListaEmpleados

9
Modificando y eliminando procedimientos
almacenados

• Modificando procedimientos almacenados


– Incluya cualquier opción en ALTER PROCEDURE
– No afecta procedimientos almacenados anidados

ALTER PROCEDURE ListaEmpleados


AS
SELECT *
FROM empleado ORDER BY nombre_Emp

• Eliminando procedimientos almacenados

DROP PROCEDURE ListaEmpleados


10
Usando parámetros en los procedimientos
almacenados

• Usando parámetros de entrada


• Ejecutando procedimientos almacenados
con parámetros de entrada
• Retornando valores son parámetros de
salida
• Recompilando explícitamente
procedimientos almacenados

11
Usando parámetros de entrada

• Capturar valores de parámetros inválidos


• Usar valores predeterminados apropiados

CREATE PROCEDURE ListaEmpleados


@departamento char(15) = ‘Investigación’,
@sexo bit = 1,
@salario smallmoney = 500
AS
SELECT Nombre_Emp, ApellidoPat_Emp, Sexo_Emp,
Salario_Emp, Nombre_Emp
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE salario_Emp >= @salario AND sexo_Emp = @sexo
AND Nombre_Dep = @departamento
12
Ejecutando procedimientos almacenados con
parámetros de entrada

• Pasando valores por referencia


EXEC ListaEmpleados
@salario = 1000,
@departamento = ‘Administración’,
@sexo = 0

• Pasando valores por posición


EXEC ListaEmpleados ‘Administración’, 0, 1000

13
Retornando valores con parámetros de salida
• Creando el procedimientos almacenado
CREATE PROCEDURE Depto
@NombreDep char(15),
@NumEmp tinyint OUTPUT
AS
SELECT @NumEmp = COUNT(*)
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE NombreD = @NombreDep

• Ejecutando
DECLARE @rpta tinyint
EXEC Depto ‘Administración’, @rpta OUTPUT
SELECT ‘El resultado es:’, @rpta 14
Manejando mensajes de error

• La sentencia RETURN sale de una consulta o


procedimiento incondicionalmente
• sp_addmessage crea un mensaje de error de
usuario
• @@error contiene el número de error para la
última sentencia ejecutada
• Sentencia RAISERROR
– Retorna mensajes de error del sistema o definidos por
el usuario
– Configura banderas del sistema para registrar errores
15
Practicas recomendadas

• Incluir técnicas de manejo de error


• Diseñar cada procedimiento almacenado
para completar una sola tarea
• Ejecutar chequeo de errores antes de
iniciar transacciones
• Usar la misma configuración de conexión
para todos los procedimientos
almacenados
16
Funciones definidas por el Usuario

1. ¿Qué es una función definida por el


usuario?
2. Tipos de funciones definidas por el
usuario
3. Creando e invocando funciones definidas
por el usuario
4. Modificando y eliminando funciones
definidas por el usuario
5. Recomendaciones
17
¿Qué es una función definida por el usuario?

• Subrutinas formadas por una o varias


instrucciones T-SQL que se pueden
utilizar para encapsular un código con el
fin de utilizarlo de nuevo posteriormente
• No tienen ninguno o tienen varios
parámetros de entrada
• Devuelven un único valor

18
Tipos de funciones definida por el usuario
• Funciones de valores escalares
– Si la cláusula RETURNS especificó uno de los tipos
de datos escalares
– Se pueden definir utilizando varias instrucciones T-
SQL
• Funciones de valores de tabla
– Si la cláusula RETURNS especifica TABLE
– Se pueden clasificar como en funciones en línea o de
múltiples instrucciones
– Si RETURNS especifica TABLE sin una lista de
columnas, la función es en línea
– Si RETURNS especifica un tipo TABLE con columnas
y sus tipos de datos, se trata de una función de
valores de tabla de múltiples instrucciones
19
Creando e invocando funciones escalares
• Usar CREATE FUNCTION
CREATE FUNCTION NumEmp1 ( @depa char(15) )
RETURNS int
BEGIN
DECLARE @num int
SELECT @num = COUNT(*)
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE NombreD = @depa
RETURN @num
END
• Invovando funciones:
– Se pueden llamar en aquellos lugares donde se utilizan
expresiones escalares
– Utilice como mínimo el nombre de dos partes de la función 20
Creando e invocando funciones de
valores de tabla en línea

• Crean funciones:
CREATE FUNCTION NumEmp2 (@depa char(15))
RETURNS table
RETURN (SELECT COUNT(*) as CUENTA
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE NombreD = @depa)

• Invocando funciones
– Se puede utilizar donde están permitidas expresiones de tabla
o vista en consultas T-SQL
– Pueden llamarse utilizando un nombre de una sola parte
21
Creando funciones de valores de tabla de
múltiples instrucciones

CREATE FUNCTION NumEmp3 (@depa char(15))


RETURNS @Ret_NumEmp3 table (col1 int)
BEGIN
INSERT INTO @Ret_NumEmp3
SELECT COUNT(*)
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE NombreD = @depa
RETURN
END

22
Invocando funciones

• Nombre de función seguido de


paréntesis
• Dentro de los paréntesis especificar los
argumentos
• No especificar nombre de parámetros
• Proporcionar valores de argumentos
para todos los parámetros y en la
misma secuencia en que están definidos
23
Modificando y eliminando funciones

• Modificando funciones
ALTER FUNCTION NumEmp2 (@depa char(15))
RETURNS table
RETURN (SELECT COUNT(*) As CUENTA
FROM Empleado As E JOIN Departamento As D
ON E.numero_Dep = D.numero_Dep
WHERE sexo = 1 AND NombreD = @depa)

• Eliminando funciones

DROP FUNCTION NumEmp2


24
Recomendaciones

• Las funciones que devuelven un tipo de datos


table pueden ser unas eficaces alternativas a
las vistas
• Una función que devuelve el tipo de datos
table también puede reemplazar
procedimientos almacenados
• Si el procedimiento almacenado devuelve un
solo conjunto de resultados, defina una función
de valores de tabla.
• Si el procedimiento almacenado calcula un
valor escalar, defina una función escalar.
25
Implementación de Desencadenadores

1. Introducción a desencadenadores
2. Tipos de desencadenadores
3. Uso de desencadenadores
4. Creando desencadenadores
5. Modificando y eliminando
desencadenadores
6. Ejemplos de desencadenadores
26
¿Qué es un desencadenador?

• Procedimiento almacenado especial que


se define para que se ejecute
automáticamente cuando se emite una
acción desencadenadora (INSERT,
UPDATE o DELETE) en una tabla o una
vista
• No puede ser llamado directamente
• Es una transacción

27
Usos de los desencadenadores

• Pueden realizar cambios en cascada por medio


de tablas relacionadas de la base de datos
• Pueden exigir restricciones mas complejas que
las restricciones CHECK
• Mantienen datos desnormalizados
• Pueden evaluar el estado de una tabla antes y
después de realizar una modificación de datos y
actuar en función de la diferencia

28
Tablas inserted y deleted

• Tablas temporales residentes en


memoria
• La tabla deleted almacena copias de
las filas afectadas por las instrucciones
DELETE y UPDATE
• La tabla inserted almacena copias de
las filas afectadas durante las
instrucciones INSERT y UPDATE

29
Tipos de desencadenadores

• Desencadenador AFTER
– Se activa después de la acción desencadenadora y tras
haber procesado cualquier restricción
– Aplicada sólo a tablas
– Varios por cada acción de desencadenamiento
– Produce el mismo efecto que especificar FOR
• Desencadenador INSTEAD OF
– Se activa en lugar de la acción desencadenadora y
antes del procesamiento de restricciones
– Aplicada a tablas y vistas
– Uno por cada acción de desencadenamiento
30
Creando desencadenadores

• Sentencia CREATE TRIGGER


CREATE TRIGGER elimina_empleado
ON Empleado FOR DELETE
AS
UPDATE Departamento
SET numeroEmp_Dep = numeroEmp_Dep - 1
FROM Departamento JOIN deleted
ON Departamento.numero_Dep = deleted.numero_Dep

31
Modificando y eliminando un desencadenador
• Modificando un desencadenador
ALTER TRIGGER elimina_empleado
ON empleado FOR DELETE
AS
UPDATE departamento SET numeroEmp_Dep = numeroEmp_Dep - 1
FROM Departamento As D JOIN deleted As Dlt
ON D.numero_Dep = Dlt.numero_Dep
UPDATE Empleado SET salario_Emp = 0.90 * E.salario_Emp
FROM Empleado As E JOIN deleted As Dlt
ON E.nss_Emp = Dlt.nss_EmpS

• Eliminando un desencadenador con DROP


TRIGGER
DROP TRIGGER elimina_empleado
32
Deshabilitando y habilitando un
desencadenador

• Deshabilitar un desencadenador

ALTER TABLE empleado DISABLE TRIGGER


elimina_empleado

• Habilitar un desencadenador

ALTER TABLE empleado ENABLE TRIGGER


elimina_empleado
33
Forzando la integridad de datos
CREATE TRIGGER elimina_reserva
ON prestamo FOR INSERT AS
IF (SELECT r.codigo FROM reservacion r JOIN inserted i ON
r.codigo=i.codigo AND r.isbn = i.isbn)>0
BEGIN
DELETE reservacion FROM reservacion r JOIN inserted i
ON r.codigo=i.codigo AND r.isbn = i.isbn
END

Prestamo Reservacion

isbn copia codigo isbn codigo


1 1 1 1 1
Fila insertada
4 1 7 1 2

4 2 4 2 1
Filas eliminadas
4 7
3 1 1
34
Forzando las reglas de negocio

IF (SELECT COUNT(*) FROM prestamo p JOIN deleted d ON


p.codigo = d.codigo)>0
ROLLBACK TRANSACTION

Transacción
La sentencia DELETE se Desencadenador valida la
abortada
ejecuta en la tabla Usuario tabla prestamo

Usuario Prestamo
codigo nombre isbn copia codigo
1 Marco Perez 1 1 1
2 Jose Lopez 4 1 1
4 2 2
3 Luis Torres
3 1 3
4 Carla Diaz

La transacción no puede ser


procesada 35
Desencadenadores INSTEAD OF

CREATE VIEW VistaDeptos


AS
SELECT D.Numero_Dep, nombre_Dep, lugar_Lde
FROM Departamento d JOIN lugarDepartamento L
ON D.numero_Dep = L.numero_Dep

CREATE TRIGGER tr_ins_depto ON VistaDeptos


INSTEAD OF INSERT
AS
INSERT departamento (numero_Dep, nombre_Dep)
SELECT numero_Dep, nombre_Dep FROM inserted
INSERT LugarDepartamento
SELECT numero_Dep, lugar_Lde FROM inserted
36
Consideraciones de rendimiento

• Los desencadenadores trabajan rápidamente


porque las tablas inserted y deleted están
en caché
• El tiempo de ejecución esta determinado:
– El número de tablas que son referenciadas
– El número de filas que son afectadas
• Las acciones contenidas implícitamente son
parte de una transacción

37

Potrebbero piacerti anche