Está en la página 1de 22

UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN

HUACHO
Ingeniería de Sistemas - V

PROCEDIMIENTO ALMACENADO

U
n procedimiento almacenado es un programa físicamente en una base de datos. Su
implementación varia de un gestor de base de datos a otro. La ventaja de un
procedimiento almacenado es que, al ser ejecutado, en respuesta a una petición de
usuario, es ejecutado directamente en el motor de base de datos el cual
usualmente corre en un servidor separado. Posee acceso directo a los datos que necesita
manipular y solo necesita enviar sus resultados de regreso al usuario deshaciéndose de la
sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.

SINTAXIS:

Create Procedure Procedimiento @NombreParametro Tipo de dato As


Instrucciones

A continuación, lo ejecutamos introduciendo un valor/res correspondiente al parámetro/os


introducido.
Exec Procedimiento Valor

--CREACIÓN DE LA BASE DE DATOS HOSPITAL

USE MASTER
GO
CREATE DATABASE Hospital
On Primary
(Name = EjemploData,
Filename = 'F:\BASE_DATOS\Hospital.mdf', -- precisar la unidad respectiva
Size = 5MB, MaxSize = 10MB,
Filegrowth = 20%)
Log on
(NAME = EjemploLog,
Filename = 'F:\BASE_DATOS\Hospital.ldf', --precisar la unidad respectiva
Size = 3MB,
MaxSize = 5MB,
FileGrowth = 1MB)
GO
USE Hospital
GO
CREATE TABLE Dept
(

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

1
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

Dept_No INT NOT NULL,


DNombre VARCHAR(50) NULL,
Loc VARCHAR(50) NULL,
CONSTRAINT PK_Dept PRIMARY KEY(Dept_No)
)
GO

CREATE TABLE Emp


(
Emp_No INT NOT NULL,
Apellido VARCHAR(50) NULL,
Oficio VARCHAR(50) NULL,
Dir INT NULL,
Fecha_Alt SMALLDATETIME NULL,
Salario NUMERIC(9,2) NULL,
Comision NUMERIC(9,2) NULL,
Dept_No INT NULL
CONSTRAINT PK_Emp PRIMARY KEY(Emp_No),
CONSTRAINT FK_Emp_Dept FOREIGN KEY (Dept_No) REFERENCES Dept(Dept_No)
)
GO

CREATE TABLE Hospital


(
Hospital_Cod INT NOT NULL,
Nombre VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Telefono VARCHAR(50) NULL,
Num_Cama INT NULL,
CONSTRAINT PK_Hospital PRIMARY KEY(Hospital_Cod)
)
GO

CREATE TABLE Doctor


(
Doctor_No INT NOT NULL,
Hospital_Cod INT NOT NULL,
Apellido VARCHAR(50) NULL,
Especialidad VARCHAR(50) NULL
CONSTRAINT PK_Doctor PRIMARY KEY(Doctor_No),
CONSTRAINT FK_Doctor_Hospital FOREIGN KEY (Hospital_Cod) REFERENCES
Hospital(Hospital_Cod)
)
GO

CREATE TABLE Sala


(
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

2
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

Nombre VARCHAR(50) NULL,


Num_Cama INT NULL
CONSTRAINT PK_Sala PRIMARY KEY(Sala_Cod,Hospital_Cod),
CONSTRAINT FK_Sala_Hospital FOREIGN KEY (Hospital_Cod) REFERENCES
Hospital(Hospital_Cod)
)
GO

CREATE TABLE Plantilla


(
Empleado_No INT NOT NULL,
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,
Apellido VARCHAR(50) NULL,
Funcion VARCHAR(50) NULL,
T VARCHAR(15) NULL,
Salario NUMERIC(9,2) NULL
CONSTRAINT PK_Plantilla PRIMARY KEY(Empleado_No),
CONSTRAINT FK_Plantilla_Sala01 FOREIGN KEY (Sala_Cod,Hospital_Cod) REFERENCES
Sala(Sala_Cod,Hospital_Cod)
)
GO

CREATE TABLE Enfermo


(
Inscripcion INT NOT NULL,
Apellido VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Fecha_Nac VARCHAR(50) NULL,
S VARCHAR(2) NULL,
NSS INT NULL
)

--***INSERTAR DATOS EN LAS TABLAS DE LA BASE DE DATOS DE EJEMPLO LLAMADA


HOSPITAL***
--Trataremos de mostrar las formas de insertar datos fijos o que no
provienen de ninguna otra tabla --

--INSERTAR DATOS EN LA TABLE DEPT

INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(10,'CONTABILIDAD','ELCHE')


INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(20,'INVESTIGACIÓN','MADRID')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(30,'VENTAS','BARCELONA')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(40,'PRODUCCIÓN','SALAMANCA')
GO

--INSERTAR DATOS EN LA TABLA EMP

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

3
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

INSERT INTO Emp( Emp_No, Apellido, Oficio, Dir, Fecha_Alt, Salario, Comision,
Dept_No)
VALUES
(7369,'SANCHEZ','EMPLEADO',7902,'17/12/1980',10400,0,20),
(7499,'ARROYO','VENDEDOR',7698,'22/02/1981',208000,39000,30),
(7521,'SALA','VENDEDOR',689,'22/02/1981',162500,65000,30),
(7566,'JIMENEZ','DIRECTOR',7839,'02/04/1981',386750,0,20),
(7654,'MARTIN','VENDEDOR',7698,'28/09/1981',182000,182000,30),
(7698,'NEGRO','DIRECTOR',7839,'01/05/1981',370500,0,30),
(7782,'CEREZO','DIRECTOR',7839,'09/06/1981',318500,0,10),
(7788,'NINO','ANALISTA',7566,'30/03/1987',390000,0,20),
(7839,'REY','PRESIDENTE',0,'17/11/1981',650000,0,10),
(7844,'TOVAR','VENDEDOR',7698,'08/09/1981',195000,0,30),
(7876,'ALONSO','EMPLEADO',7788,'03/05/1987',143000,0,20),
(7900,'JIMENO','EMPLEADO',7698,'03/12/1981',123500,0,30),
(7902,'FERNANDEZ','ANALISTA',7566,'03/12/1981',390000,0,20),
(7934,'MUÑOZ','EMPLEADO',7782,'23/06/1982',169000,0,10),
(7119,'SERRA','DIRECTOR',7839,'19/11/1983',225000,39000,20),
(7322,'GARCIA','EMPLEADO',7119,'12/10/1982',129000,0,20)
GO

--INSERTAR DATOS EN LA TABLA HOSPITAL

INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)


VALUES(19,'Provincial','O Donell 50','964-4256',502)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)
VALUES(18,'General','Atocha s/n','595-3111',987)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(22,'La
Paz','Castellana 1000','923-5411',412)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)
VALUES(45,'San Carlos','Ciudad Universitaria','597-1500',845)
GO

--INSERTAR DATOS EN LA TABLA DOCTOR

INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)


VALUES(22,386,'Cabeza D.','Psiquiatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,398,'Best
D.','Urología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(19,435,'López A.','Cardiología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,453,'Galo
D.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(45,522,'Adams C.','Neurología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(18,585,'Miller G.','Ginecología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(45,607,'Chuki P.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(18,982,'Cajal R.','Cardiología')
GO

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

4
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

--INSERTAR DATOS EN LA TABLA SALA

INSERT INTO SALA VALUES(1,22,'Recuperación',10)


INSERT INTO SALA VALUES(1,45,'Recuperación',15)
INSERT INTO SALA VALUES(2,22,'Maternidad',34)
INSERT INTO SALA VALUES(2,45,'Maternidad',24)
INSERT INTO SALA VALUES(3,19,'Cuidados Intensivos',21)
INSERT INTO SALA VALUES(3,18,'Cuidados Intensivos',10)
INSERT INTO SALA VALUES(4,18,'Cardiología',53)
INSERT INTO SALA VALUES(4,45,'Cardiología',55)
INSERT INTO SALA VALUES(6,19,'Psiquiátricos',67)
INSERT INTO SALA VALUES(6,22,'Psiquiátricos',118)
GO

--INSERTAR DATOS EN LA TABLA PLANTILLA

INSERT INTO Plantilla(Hospital_Cod,Sala_Cod,Empleado_No,Apellido, Funcion, T,


Salario)
VALUES
(22,6,1009,'Higueras D.','Enfermera','T',200500),
(45,4,1280,'Amigo R.','Interino','N',221000),
(19,6,3106,'Hernández','Enfermero','T',275000),
(19,6,3754,'Díaz B.','Enfermera','T',226200),
(22,1,6065,'Rivera G.','Enfermera','N',162600),
(18,4,6357,'Karplus W.','Interino','T',337900),
(22,1,7379,'Carlos R.','Enfermera','T',211900),
(22,6,8422,'Bocina G.','Enfermero','M',183800),
(45,1,8526,'Frank H.','Enfermera','T',252200),
(22,2,9901,'Núñez C.','Interino','M',221000)
GO

--INSERTAR DATOS EN LA TABLA ENFERMO

INSERT INTO Enfermo(Inscripcion,Apellido,Direccion,Fecha_Nac,S,NSS)


VALUES
(10995,'Laguía M.','Goya 20','16-may-56','M',280862422),
(14024,'Fernández M.','Recoletos 50','21-may-60','F',284991452),
(18004,'Serrano V.','Alcalá 12','23-jun-67','F',321790059),
(36658,'Domin S.','Mayor 71','01-ene-42','M',160654471),
(38702,'Neal R.','Orense 11','18-jun-40','F',380010217),
(39217,'Cervantes M.','Perón 38','29-feb-52','M',440294390),
(59076,'Miller B.','López de Hoyos 2','16-sep-45','F',311969044),
(63827,'Ruiz P.','Ezquerdo 103','26-dic-80','M',100973253),
(64823,'Fraiser A.','Soto 3','10-jul-80','F',285201776),
(74835,'Benítez E.','Argentina','05-oct-57','M',154811767)
EJEMPLO N° 01

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

5
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

Crea el procedimiento numempdept con el parámetro ndep que es tipo smallint (equivalente al
short en visual). El procedimiento hace una select que realiza grupos por número de
departamento y cuenta cuantos empleados hay en cada departamento.

CREATE PROCEDURE NUMEMPDEPT @NDEP SMALLINT


AS SELECT COUNT(*) AS [NUM EMPLEADOS], DEPT_NO Ejecuta el procedimiento introduciendo el
FROM EMP valor 20 para el parámetro ndep, con lo que
WHERE DEPT_NO = @NDEP haría la select sobre el departamento 20.
GROUP BY DEPT_NO

EXEC NUMEMPDEPT 20

EJEMPLO N° 02

CREATE PROCEDURE BUSCAEMP(


@NDEP SMALLINT,
@NOFICIO NVARCHAR(19))
AS
SELECT * FROM EMP
WHERE DEPT_NO = @NDEP
AND OFICIO = @NOFICIO

EXEC BUSCAEMP 20,'Empleado'

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

6
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

PROCEDIMIENTOS ALMACENADOS
PARÁMETROS CON VALORES POR
DEFECTO

SINTAXIS:

Create Procedure Nombre @Variable tipo = Valor


As
Instrucciones

Donde Valor es el valor que le damos por defecto, este valor puede almacenar comodines (como
% que equivale a *).

EJEMPLO N° 01
Crea un procedimiento con el parámetro ndept y le da por defecto valor 10.

CREATE PROCEDURE NUMEMP @NDEPT SMALLINT = 10


AS
SELECT DEPT_NO, COUNT(*) AS [NUM EMPLEADOS]
FROM EMP
WHERE DEPT_NO = @NDEPT
GROUP BY DEPT_NO

EXEC NUMEMP

EJEMPLO N° 02

Debe devolver salario, oficio y comisión y le pasamos el apellido.

CREATE PROCEDURE SALARIOOFICIO @PAPELLIDO VARCHAR(20) = 'REY' AS


SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO = @PAPELLIDO

EXEC SALARIOOFICIO 'GARCIA'

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

7
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

EJEMPLO N° 03
Sacaría oficio, salario y comisión de los empleados que tuviesen una S en su apellido.

CREATE PROCEDURE SALARIOOFICIOLIKE(


@PAPELLIDO VARCHAR(20) = 'REY' )
AS
SELECT OFICIO, SALARIO, COMISION
FROM EMP
WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%'

EXEC SALARIOOFICIOLIKE 's'

EJEMPLO N° 4
Introducir oficio y salario debe sacar el apellido de los empleados que tengan el mismo apellido y
ganen mas del salario indicado. Debemos hacer que sino introduce nada saque todos los registros.

CREATE PROCEDURE DOSPARAMETROS2(


@OFICIO VARCHAR(12) = '%',
@SALARIO VARCHAR(10) = '0' )
AS
SELECT APELLIDO FROM EMP WHERE OFICIO
LIKE @OFICIO AND SALARIO > @SALARIO

EXEC DOSPARAMETROS2 'Empleado',1000

EJEMPLO N° 05
Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y
que pertenecen a un determinado departamento.

CREATE PROCEDURE TRESPARAMETROS(


@FINICIAL DATETIME = '01-01-1980',
@FFINAL SMALLDATETIME = '12-07-2002',
@DEPT_NO NVARCHAR(10) = '%'
)
AS
SELECT * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL
AND CAST(DEPT_NO AS VARCHAR(10)) LIKE @DEPT_NO

EXEC TRESPARAMETROS '01-01-1980','12-07-2002','30'

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

8
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

EJEMPLO N° 06
Crear procedimiento que inserte un empleado. Crear otro procedimiento que borre un empleado
que coincida con los parámetros indicados (los parámetros serán todos los campos de la tabla
empleado).

CREATE PROCEDURE [INSERTA EMPLEADO](


@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,
@SALARIO INT,
@COMISION INT,
@DEPT_NO INT)
AS
INSERT INTO EMP VALUES (@EMP_NO, @APELLIDO, @OFICIO,
@DIR, @FECHA_ALT, @SALARIO, @COMISION, @DEPT_NO)

EXEC [INSERTA EMPLEADO] 7855,'ALIAGA','EMPLEADO',7782,'23/05/2015',45000,0,30

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

9
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

ELIMINAR REGISTRO

CREATE PROCEDURE [BORRA EMPLEADO](


@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,
@SALARIO INT,
@COMISION INT,
@DEPT_NO INT
)
AS
DELETE FROM EMP WHERE EMP_NO = @EMP_NO
AND APELLIDO = @APELLIDO
AND OFICIO = @OFICIO
AND DIR = @DIR
AND FECHA_ALT = @FECHA_ALT
AND SALARIO = @SALARIO
AND COMISION = @COMISION
AND DEPT_NO = @DEPT_NO

EXEC [BORRA EMPLEADO] 7855,'ALIAGA','EMPLEADO',7782,'23/05/2015',45000,0,30

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

10
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

EJERCICIOS
PROCEDIMIENTOS ALMACENADOS

SQL SERVER

1. Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha
final y que pertenecen a un determinado departamento.

CREATE PROCEDURE FECHASDEPT


@FINICIAL DATETIME,
@FFINAL SMALLDATETIME ,
@DEPT_NO NVARCHAR(10)
AS
SELECT * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL
AND DEPT_NO = @DEPT_NO

EXEC FECHASDEPT '01/01/1965','01/01/1985',20

2. Crear procedimiento que inserte un empleado.

CREATE PROCEDURE INSERTA_EMPLEADO


@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,
@SALARIO INT,
@COMISION INT,
@DEPT_NO INT
AS
INSERT INTO EMP VALUES
(@EMP_NO, @APELLIDO, @OFICIO, @DIR, @FECHA_ALT, @SALARIO, @COMISION, @DEPT_NO)

EXEC INSERTA_EMPLEADO 7895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

11
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

3. Crear un procedimiento que recupere el nombre, número y número de personas a partir del
número de departamento.

CREATE PROCEDURE NUMEMP_DEPT @NDEP SMALLINT


AS SELECT COUNT(*) AS [NUM EMPLEADOS], DEPT_NO
FROM EMP
WHERE DEPT_NO = @NDEP
GROUP BY DEPT_NO

EXEC NUMEMP_DEPT 30

SELECT * FROM EMP

4. Crear un procedimiento igual que el anterior, pero que recupere también las personas que
trabajan en dicho departamento, pasándole como parámetro el nombre.

CREATE PROCEDURE PERSONASDEPT @DEPT NVARCHAR(30)


AS
SELECT E.DEPT_NO AS [NUMERO DEPT], D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO
EMPLEADOS]
FROM EMP AS E
INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO
WHERE D.DNOMBRE = @DEPT
GROUP BY D.DNOMBRE, E.DEPT_NO
SELECT E.DEPT_NO AS [Nº DEPARTAMENTO], D.DNOMBRE AS [DEPARTAMENTO], E.APELLIDO,
E.SALARIO
FROM EMP AS E
INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO
WHERE D.DNOMBRE = @DEPT

EXEC PERSONASDEPT 'CONTABILIDAD'

5. Crear procedimiento para devolver salario, oficio y comisión, pasándole el apellido.

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

12
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

CREATE PROCEDURE SALARIO_OFICIO @PAPELLIDO NVARCHAR(20) AS


SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO = @PAPELLIDO

EXEC SALARIO_OFICIO 'GARCIA'

6. Igual que el anterior, pero si no le pasamos ningún valor, mostrará los datos de todos los
empleados.

CREATE PROCEDURE OFICIOSALARIO @PAPELLIDO NVARCHAR(20) ='%' AS


SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE @PAPELLIDO

EXEC OFICIOSALARIO 'SUAREZ

7. Crear un procedimiento para mostrar el salario, oficio, apellido y nombre del departamento
de todos los empleados que contengan en su apellido el valor que le pasemos como
parámetro.

CREATE PROCEDURE SALARIO_OFICIOLIKE @PAPELLIDO VARCHAR(20) = 'REY' AS


SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%'

EXEC SALARIO_OFICIOLIKE 'S'

8. Crear un procedimiento que recupere el número departamento, el nombre y número de


empleados, dándole como valor el nombre del departamento, si el nombre introducido no es
válido, mostraremos un mensaje informativo comunicándolo.

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

13
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

CREATE PROCEDURE DEPARTAMENTO @DEPT NVARCHAR(30)


AS
DECLARE @DEPTDEF NVARCHAR(30)
SET @DEPTDEF = NULL
SELECT @DEPTDEF = DNOMBRE FROM DEPT
WHERE DNOMBRE = @DEPT
IF (@DEPTDEF IS NULL)
PRINT 'DEPARTAMENTO INTRODUCIDO NO VALIDO: ' + @DEPT
ELSE
BEGIN
SELECT E.DEPT_NO AS [NUMERO DEPT]
, D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS]
FROM EMP AS E
INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO
WHERE D.DNOMBRE = @DEPT
GROUP BY D.DNOMBRE, E.DEPT_NO
END

EXEC DEPARTAMENTO 'VENTAS'

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

14
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

TRIGGERS
SQL SERVER
DESENCADENADORES
DISPARADORES

Son las operaciones de inserción (INSERT), borrado (DELETE) o actualización (UPDATE), ya que
modifican los datos de una tabla. La utilidad principal de un trigger es mejorar la administración de
la base de datos, ya que no requieren que un usuario los ejecute.

Los triggers pueden ser extremadamente útiles para llevar a cabo las siguientes casos:
 Cuando los datos de una tabla son generados desde otro tipo de procesos y es necesario
que se controlen los valores, para evitar que algunos campos tomen valores concretos.
 Para duplicar los contenidos de una tabla automaticamente y en tiempo real.
 Para implementar restricciones sobre valores que pueden tomar ciertos campos de la
tabla.
 Incrementar automáticamente los valores de un campo.
 Para controlar las modificaciones de los valores de los campos.
 Para realizar actualizaciones de una tabla en cascada.
 Para modificar campos o registros en una tabla que un usuario no puede modificar
directamente.

--Creación de la base de datos ESSALUD

USE MASTER
GO
CREATE DATABASE ESSALUD
GO
USE ESSALUD
GO

CREATE TABLE Dept


(
Dept_No INT NOT NULL,
DNombre VARCHAR(50) NULL,
Loc VARCHAR(50) NULL

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

15
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

)
GO

CREATE TABLE Emp


(
Emp_No INT NOT NULL,
Apellido VARCHAR(50) NULL,
Oficio VARCHAR(50) NULL,
Dir INT NULL,
Fecha_Alt SMALLDATETIME NULL,
Salario NUMERIC(9,2) NULL,
Comision NUMERIC(9,2) NULL,
Dept_No INT NULL
)
GO

CREATE TABLE Hospital


(
Hospital_Cod INT NOT NULL,
Nombre VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Telefono VARCHAR(50) NULL,
Num_Cama INT NULL
)
GO

CREATE TABLE Doctor


(
Doctor_No INT NOT NULL,
Hospital_Cod INT NOT NULL,
Apellido VARCHAR(50) NULL,
Especialidad VARCHAR(50) NULL
)
GO

CREATE TABLE Sala


(
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,
Nombre VARCHAR(50) NULL,
Num_Cama INT NULL
)
GO

CREATE TABLE Plantilla


(
Empleado_No INT NOT NULL,
Sala_Cod INT NOT NULL,
Hospital_Cod INT NOT NULL,

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

16
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

Apellido VARCHAR(50) NULL,


Funcion VARCHAR(50) NULL,
T VARCHAR(15) NULL,
Salario NUMERIC(9,2) NULL
)
GO

CREATE TABLE Enfermo


(
Inscripcion INT NOT NULL,
Apellido VARCHAR(50) NULL,
Direccion VARCHAR(50) NULL,
Fecha_Nac VARCHAR(50) NULL,
S VARCHAR(2) NULL,
NSS INT NULL
)
GO

--INSERTAR DATOS EN LA TABLE DEPT

INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(10,'CONTABILIDAD','ELCHE')


INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(20,'INVESTIGACIÓN','MADRID')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(30,'VENTAS','BARCELONA')
INSERT INTO Dept(Dept_No,DNombre,Loc) VALUES(40,'PRODUCCIÓN','SALAMANCA')
GO

--INSERTAR DATOS EN LA TABLA EMP

INSERT INTO Emp( Emp_No, Apellido, Oficio, Dir, Fecha_Alt, Salario, Comision,
Dept_No)
VALUES
(7369,'SANCHEZ','EMPLEADO',7902,'17/12/1980',10400,0,20),
(7499,'ARROYO','VENDEDOR',7698,'22/02/1981',208000,39000,30),
(7521,'SALA','VENDEDOR',689,'22/02/1981',162500,65000,30),
(7566,'JIMENEZ','DIRECTOR',7839,'02/04/1981',386750,0,20),
(7654,'MARTIN','VENDEDOR',7698,'28/09/1981',182000,182000,30),
(7698,'NEGRO','DIRECTOR',7839,'01/05/1981',370500,0,30),
(7782,'CEREZO','DIRECTOR',7839,'09/06/1981',318500,0,10),
(7788,'NINO','ANALISTA',7566,'30/03/1987',390000,0,20),
(7839,'REY','PRESIDENTE',0,'17/11/1981',650000,0,10),
(7844,'TOVAR','VENDEDOR',7698,'08/09/1981',195000,0,30),
(7876,'ALONSO','EMPLEADO',7788,'03/05/1987',143000,0,20),
(7900,'JIMENO','EMPLEADO',7698,'03/12/1981',123500,0,30),
(7902,'FERNANDEZ','ANALISTA',7566,'03/12/1981',390000,0,20),
(7934,'MUÑOZ','EMPLEADO',7782,'23/06/1982',169000,0,10),
(7119,'SERRA','DIRECTOR',7839,'19/11/1983',225000,39000,20),
(7322,'GARCIA','EMPLEADO',7119,'12/10/1982',129000,0,20)
GO

--INSERTAR DATOS EN LA TABLA HOSPITAL

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

17
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)


VALUES(19,'Provincial','O Donell 50','964-4256',502)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)
VALUES(18,'General','Atocha s/n','595-3111',987)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama) VALUES(22,'La
Paz','Castellana 1000','923-5411',412)
INSERT INTO Hospital(Hospital_Cod,Nombre,Direccion,Telefono, Num_Cama)
VALUES(45,'San Carlos','Ciudad Universitaria','597-1500',845)
GO

--INSERTAR DATOS EN LA TABLA DOCTOR

INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)


VALUES(22,386,'Cabeza D.','Psiquiatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,398,'Best
D.','Urología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(19,435,'López A.','Cardiología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad) VALUES(22,453,'Galo
D.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(45,522,'Adams C.','Neurología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(18,585,'Miller G.','Ginecología')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(45,607,'Chuki P.','Pediatría')
INSERT INTO Doctor(Hospital_Cod,Doctor_No,Apellido,Especialidad)
VALUES(18,982,'Cajal R.','Cardiología')
GO

--INSERTAR DATOS EN LA TABLA SALA

INSERT INTO SALA VALUES(1,22,'Recuperación',10)


INSERT INTO SALA VALUES(1,45,'Recuperación',15)
INSERT INTO SALA VALUES(2,22,'Maternidad',34)
INSERT INTO SALA VALUES(2,45,'Maternidad',24)
INSERT INTO SALA VALUES(3,19,'Cuidados Intensivos',21)
INSERT INTO SALA VALUES(3,18,'Cuidados Intensivos',10)
INSERT INTO SALA VALUES(4,18,'Cardiología',53)
INSERT INTO SALA VALUES(4,45,'Cardiología',55)
INSERT INTO SALA VALUES(6,19,'Psiquiátricos',67)
INSERT INTO SALA VALUES(6,22,'Psiquiátricos',118)
GO

--INSERTAR DATOS EN LA TABLA PLANTILLA

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

18
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

INSERT INTO Plantilla(Hospital_Cod,Sala_Cod,Empleado_No,Apellido, Funcion, T,


Salario)
VALUES
(22,6,1009,'Higueras D.','Enfermera','T',200500),
(45,4,1280,'Amigo R.','Interino','N',221000),
(19,6,3106,'Hernández','Enfermero','T',275000),
(19,6,3754,'Díaz B.','Enfermera','T',226200),
(22,1,6065,'Rivera G.','Enfermera','N',162600),
(18,4,6357,'Karplus W.','Interino','T',337900),
(22,1,7379,'Carlos R.','Enfermera','T',211900),
(22,6,8422,'Bocina G.','Enfermero','M',183800),
(45,1,8526,'Frank H.','Enfermera','T',252200),
(22,2,9901,'Núñez C.','Interino','M',221000)
GO

--INSERTAR DATOS EN LA TABLA ENFERMO

INSERT INTO Enfermo(Inscripcion,Apellido,Direccion,Fecha_Nac,S,NSS)


VALUES
(10995,'Laguía M.','Goya 20','16-may-56','M',280862422),
(14024,'Fernández M.','Recoletos 50','21-may-60','F',284991452),
(18004,'Serrano V.','Alcalá 12','23-jun-67','F',321790059),
(36658,'Domin S.','Mayor 71','01-ene-42','M',160654471),
(38702,'Neal R.','Orense 11','18-jun-40','F',380010217),
(39217,'Cervantes M.','Perón 38','29-feb-52','M',440294390),
(59076,'Miller B.','López de Hoyos 2','16-sep-45','F',311969044),
(63827,'Ruiz P.','Ezquerdo 103','26-dic-80','M',100973253),
(64823,'Fraiser A.','Soto 3','10-jul-80','F',285201776),
(74835,'Benítez E.','Argentina','05-oct-57','M',154811767)

EJEMPLOS DE USO DE UN TRIGGER


Si tenemos una tabla de clientes, y otra de informes, por ej. cada vez que se produzca una baja en
clientes, almacenamos el nombre y apellidos del cliente en informe para posteriormente hacer
una estadística con los clientes borrados.

Tenemos la tabla de nóminas, cada vez que un usuario acceda a ella, el trigger se activa y
almacena su nombre en otra tabla.

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

19
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

EJEMPLO DE TRIGGER PARA DELETE

Vamos a ver un ejemplo de creación de un trigger para cuando borremos un departamento se


actualice la tabla empleados borrando todos aquellos cuyo departamento sea el eliminado. En
este caso como queremos borrar, obtendremos la información de la tabla Deleted, que es una
tabla de sistema donde se almacenan todos los datos borrados de todas las tablas. Con lo que la
instrucción quedaría así.

DELETE FROM DEPT WHERE DEPT_NO = 70


CREATE TRIGGER [BORRADOR]
ON DEPT
FOR DELETE
AS
DELETE FROM EMP
FROM EMP, DELETED
WHERE
EMP.DEPT_NO = DELETED.DEPT_NO

Al ejecutar la eliminación de un departamento llamará al Trigger el cual se ejecutará


inmediatamente.

EJEMPLO DE TRIGGER PARA INSERT

En este ejemplo inserto un nuevo empleado y lo que hago es mostrar el empleado insertado desde
la tabla inserted.

CREATE TRIGGER
INSERTAR_EMP INSERT INTO EMP(Emp_No, Apellido, Oficio, Dir, Fecha_Alt,
ON EMP Salario, Comision, Dept_No)
FOR INSERT VALUES(7455,'GANOZA','EMPLEADO',7902,'29/05/2015',15520,0,20)
AS
SELECT * FROM INSERTED

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

20
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

EJEMPLO DE TRIGGER PARA UPDATE

Como hemos visto en el ejemplo anterior, para borrar existe la tabla de sistema deleted donde
almacena los registros borrados, al igual que para insertar almacena los registros insertados en la
tabla inserted, pero para modificar no existe ninguna tabla update, lo que hace en realidad es
insertar en la tabla deleted el registro antes de ser modificado y en la tabla inserted el registro ya
modificado, porque entiende que se ha borrado un registro y se ha insertado otro.

Con lo cual para crear un trigger que se active con un update, trabajaremos con las tablas del
sistema deleted e inserted.

CREATE TRIGGER [MODIFICAR]


ON DEPT
FOR UPDATE
AS
UPDATE EMP
SET
DEPT_NO = INSERTED.DEPT_NO
FROM EMP,DELETED,INSERTED
WHERE
EMP.DEPT_NO = DELETED.DEPT_NO

EJEMPLO

El siguiente ejemplo almacenará en una tabla que crearemos un registro con datos de cada fila
que borremos, modifiquemos o insertemos.
Este registro contendrá

 Nº de empleado.
 Usuario que realizó la consulta de acción.
 Fecha de la consulta de acción.
 Tipo de operación realizada.

1. CREAMOS UNA TABLA

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

21
UNIVERSIDAD NACIONAL JOSÉ FAUSTINO SÉNCHEZ CARRIÓN
HUACHO
Ingeniería de Sistemas - V

CREATE TABLE Control_BD


(
Emp_no INT NULL,
Usuario VARCHAR(20) NULL,
Fecha DATETIME NULL,
Operacion VARCHAR(15) NULL
)

2. CREAMOS EL TRIGGER DE BORRADO EN LA TABLA DE EMPLEADOS.

CREATE TRIGGER BORRADOR ON EMP


FOR DELETE
AS
INSERT INTO CONTROL_BD (EMP_NO, USUARIO, FECHA, OPERACION)
SELECT EMP_NO,USER_NAME(), GETDATE(),'BORRADO'
FROM DELETED

BIMPLEMENTACIÓN Y GESTIÓN DE BASE DE DATOS

22

También podría gustarte