Informe Final

33
TRABAJO N° 01 Integridad de datos, funciones, cursores y triggers Integrantes: - Blas Zavaleta, Maicol - Gonzales Castillo, Jorge - Juarez Guzmán, Miguel - Ramos Suyón, Juan - Soles Cavero, Edilberto

description

Informe FinalInforme FinalInforme Final

Transcript of Informe Final

Integridad de datos, funciones, cursores y triggers

NDICE DE CONTENIDOS1. Modelo de base de datos en Erwin (modelo gua)2. Script SQL Server para la creacin de la BD3. Modelo de base de datos en SQL Server (modelo definitivo)4. Capturas que demuestran las restricciones de dominio aplicadas5. Listado de funciones usadas6. Listado de triggers y procedimientos almacenados usados y sus aplicaciones

1. Modelo de base de datos en Erwin (modelo gua)

2. Script SQL Server para la creacin de la BDUSE masterGO

DROP DATABASE HotelDBgo

CREATE DATABASE HotelDBgo

USE HotelDBGO

CREATE TABLE Cliente(DNI char(8) NOT NULL,nombres varchar(50) NOT NULL,apellidoPaterno varchar(50) NOT NULL,apellidoMaterno varchar(50) NOT NULL,fechaNac date,estadoCivil varchar(10),pais varchar(50),ciudad varchar(50),sexo char(1),telefono varchar(20));

ALTER TABLE Cliente ADD CONSTRAINT [PK_DNI]PRIMARY KEY (DNI),CONSTRAINT [CHK_sexo]CHECK (sexo in ('H', 'M')),CONSTRAINT [DF_sexo]DEFAULT 'H' FOR sexo,CONSTRAINT [CHK_estadoCivil]CHECK (estadoCivil IN ('Soltero', 'Casado', 'Viudo', 'Divorciado'))GO

CREATE TABLE Huesped(HuespedID int identity(1,1) NOT NULL,DNI char(8) NOT NULL,primerIngreso date);

ALTER TABLE Huesped ADD CONSTRAINT [PK_HuespedID]PRIMARY KEY (HuespedID),CONSTRAINT [FK_DNI]FOREIGN KEY (DNI) REFERENCES Cliente(DNI)GO

CREATE TABLE Usuario(UsuarioID int NOT NULL,loginn varchar(50),passwordd char(5));

ALTER TABLE Usuario ADD CONSTRAINT [PK_UsuarioID]PRIMARY KEY (UsuarioID),CONSTRAINT [FK_UsuarioID]FOREIGN KEY (UsuarioID) REFERENCES Huesped(HuespedID)GO

CREATE TABLE ContratoAuditorio(ContratoAuditID int identity(1,1) NOT NULL,DNI char(8) not null,fechaInicio date,duracion int);

ALTER TABLE ContratoAuditorio ADD CONSTRAINT [PK_ContratoAudiID]PRIMARY KEY (ContratoAuditID),CONSTRAINT [FK_ContratoAuditID] FOREIGN KEY (DNI) REFERENCES Cliente(DNI)GO

CREATE TABLE ServAuditorio(ServAuditorioID int identity(1,1) NOT NULL,descripcion varchar(50),precio numeric(8,2));

ALTER TABLE ServAuditorio ADD CONSTRAINT [PK_ServAuditorioID]PRIMARY KEY (ServAuditorioID)GO

CREATE TABLE ContratoServAuditorio(ServAuditorioID int NOT NULL,ContratoAuditID int NOT NULL,dscto numeric(8,2));

ALTER TABLE ContratoServAuditorio ADD CONSTRAINT [PK_ContratoServAuditorio]PRIMARY KEY (ServAuditorioID,ContratoAuditID),CONSTRAINT [FK_ServAuditorio] FOREIGN KEY(ServAuditorioID) REFERENCES ServAuditorio(ServAuditorioID),CONSTRAINT [FK_ContratoAuditorio] FOREIGN KEY(ContratoAuditID) REFERENCES ContratoAuditorio(ContratoAuditID)GO

CREATE TABLE Habitacion(HabitacionID int identity(1,1) NOT NULL,tipo char(11) NOT NULL,estado char(9) NOT NULL);

ALTER TABLE HabitacionADD CONSTRAINT [PK_HabitacionID]PRIMARY KEY (HabitacionID),CONSTRAINT [CHK_Habitacion_estado]CHECK ( estado in ('Libre', 'Reservada', 'Ocupada') ),CONSTRAINT [DF_estado]DEFAULT 'Libre' FOR estado,CONSTRAINT [CHK_Habitacion_tipo]CHECK ( tipo in ('Simple', 'Doble', 'Triple', 'Matrimonial', 'Familiar', 'Suite' ) )GO

CREATE TABLE Reservacion (ReservacionID int identity(1,1) NOT NULL,HabitacionID int NOT NULL,fechaIngreso date,fechaSalida date,HuespedID int NOT NULL,estado varchar(10));

ALTER TABLE ReservacionADD CONSTRAINT [PK_ReservacionID]PRIMARY KEY (ReservacionID),CONSTRAINT [FK_HuespedID]FOREIGN KEY (HuespedID) REFERENCES Huesped(HuespedID),CONSTRAINT [FK_HabitacionID]FOREIGN KEY (HabitacionID) REFERENCES Habitacion(HabitacionID),CONSTRAINT [CHK_Reservacion_Estado]CHECK ( estado in ('Cancelada', 'Finalizada','En curso','En espera') )GO

CREATE TABLE ServAdicionales(ServicioID int identity(1,1) NOT NULL,descripcion varchar(20),precio numeric(8,2));

ALTER TABLE ServAdicionalesADD CONSTRAINT [PK_ServicioID]PRIMARY KEY (ServicioID)GO

CREATE TABLE ContratoAdicional(ReservacionID int not null,ServicioID int not null,dscto numeric(8,2));

ALTER TABLE ContratoAdicionalADD CONSTRAINT [PK_ContratoAdicional]PRIMARY KEY (ReservacionID,ServicioID),CONSTRAINT [FK_ReservacionID] FOREIGN KEY(ReservacionID) REFERENCES Reservacion(ReservacionID),CONSTRAINT [FK_ServicioID] FOREIGN KEY(ServicioID) REFERENCES ServAdicionales(ServicioID)GO

3. Modelo de base de datos en SQL Server (modelo definitivo)

4. Capturas que demuestran las restricciones de dominio aplicadas

4.1. Restricciones en la tabla Cliente

Dominio de atributo sexo

Valor por defecto del atributo sexo

Dominio del atributo estadoCivil

4.2. Restricciones en la tabla Habitacin

Dominio de atributo estado

Valor por defecto del atributo estado

Dominio del atributo tipo

4.3. Restricciones de la tabla Reservacin

Dominio del atributo estado

5. Listado de funciones usadasif OBJECT_ID('dbo.contarVocales') is NOT NULLDROP FUNCTION dbo.contarVocalesgo

CREATE FUNCTION dbo.contarVocales(@Cadena varchar(55), @Pos int)RETURNS int ASBEGINif @Pos>LEN(@Cadena)return 0 -- Comodn para terminar sin afectar

-- Lgicaif LOWER(SUBSTRING(@Cadena, @Pos, 1)) in ('a', 'e', 'i', 'o', 'u')return 1+dbo.contarVocales(@Cadena, @Pos+1)return dbo.contarVocales(@Cadena, @Pos+1)END

6. Listado de triggers y procedimientos almacenados usados y sus aplicaciones

6.1. Trigger para generar Usuario:CREATE TRIGGER GenerarUsuario ON [Huesped] FOR INSERT ASBEGINSET NOCOUNT ON-- Declaracin de variables a obtenerDECLARE @UsuarioID intDECLARE @Login varchar(50)DECLARE @Passwordd char(05)DECLARE @numVocales varchar(10)

-- Declaracin de variables obtenidas de la insercinDECLARE @DNI char(08)DECLARE @Nombres varchar(50)DECLARE @ApePaterno varchar(50)DECLARE @ApeMaterno varchar(50)DECLARE @HuespedID int

--Declaracion de variables logicas de las funcionesDECLARE @Cuenta intDECLARE @Existe bitDECLARE @Prefijo varchar(50)

-- Empezamos generando el LoginnSET @Cuenta=1-- Obtenemos los datos del Cliente apartir del HuespedSELECT @DNI=C.DNI,@Nombres=C.nombres,@ApePaterno=C.apellidoPaterno,@ApeMaterno=C.apellidoMaternoFROM Cliente C JOIN inserted I ON I.DNI=C.DNI

-- Obtenemos el ID del HuespedSELECT @HuespedID = HuespedID FROM inserted

-- Implementamos la lgica para generar el LoginDECLARE @PrimerLetraApP varchar(20),@primerNombre varchar(20), @PosLetraSN int

SET @PrimerLetraApP= LEFT(@ApePaterno,1)

SET @PosLetraSN=CHARINDEX (' ', @Nombres)SET @primerNombre= LEFT(@Nombres,@PosLetraSN-1)

SET @Prefijo = @PrimerLetraApP + @primerNombre

SET @Cuenta=1SET @Existe=1

DECLARE cursor_ID CURSOR FORSELECT loginn FROM UsuarioWHERE loginn LIKE @Prefijo + '%'

OPEN cursor_ID WHILE (@Existe=1) BEGIN FETCH NEXT FROM cursor_ID INTO @LoginIF (@Login = @Prefijo + RIGHT('0'+ CONVERT(VARCHAR(50), @Cuenta),2) + '@unt.edu.pe')SET @Cuenta=@Cuenta+1 ELSE BEGIN SET @Existe=0 SET @Login=@Prefijo + RIGHT('0'+ CONVERT(VARCHAR(50), @Cuenta),2) + '@unt.edu.pe' ENDENDCLOSE cursor_ID DEALLOCATE cursor_ID

-- Generamos el passwordSET @numVocales = CONVERT(VARCHAR(10), dbo.contarVocales(@Login,1))

SET @Passwordd = LOWER(SUBSTRING(@ApePaterno,1,1)) + LOWER(SUBSTRING(@Apematerno,1,1)) + @numVocales + @numVocales + @numVocales

--SET @numVocales = (LEN(@Login) - LEN(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Passwordd,'a',''),'e',''),'i',''),'o',''),'u',''))) INSERT INTO Usuario VALUES (@HuespedID, @Login, @Passwordd)ENDgo

Insertamos un cliente para hacer la prueba correspondiente:

Insertamos un husped para generar el usuario correspondiente:

6.2. Trigger para registrar una nueva reserva, segn el ID de la habitacin. CREATE TRIGGER ReservarHab ON Reservacion FOR INSERT ASBEGINDECLARE @fechaIngreso date, @fechaSalida dateDECLARE @habitacionID intSELECT @fechaIngreso = fechaIngreso, @fechaSalida = fechaSalida,@habitacionID = HabitacionIDFROM inserted

if @fechaSalida>@fechaIngresoBEGINif @fechaIngreso>GETDATE()UPDATE Habitacion set estado = 'Reservada' WHERE HabitacionID = @habitacionID AND estado = 'Libre'else UPDATE Habitacion set estado = 'Ocupada' WHERE HabitacionID = @habitacionID AND estado = 'Libre'ENDEND Go

Insertamos dos habitaciones para hacer las reservaciones.

Hacemos dos reservaciones para separar las habitaciones correspondientes.

6.3. Procedimiento almacenado para registrar una nueva reserva, segn el tipo de habitacin.if OBJECT_ID('InsertarReservacion') is not nullDROP PROCEDURE InsertarReservaciongo

CREATE PROCEDURE InsertarReservacion(@tipo char(11),@fechaI date,@fechaS date,@huesped int) ASBEGIN TRANSACTION TransacReserv-- Obtener ID de la habitacin disponibleDECLARE @HabitacionID intSELECT TOP 1 @HabitacionID = HabitacionIDFROM HabitacionWHERE tipo = @tipo AND estado = 'Libre'

if @HabitacionID is NULLBEGINRAISERROR('No se encuentr ninguna habitacin disponible de ese tipo.', 10, 4)ROLLBACK TRANSACTION TransacReservRETURNEND-- Obtener ID del huespedDECLARE @HuespedID intSELECT @HuespedID = HuespedID FROM HuespedWHERE HuespedID = @huesped

if @HuespedID is NULLBEGINRAISERROR('No se encuentr ningn husped con el ID indicado.', 10, 4)ROLLBACK TRANSACTION TransacReservRETURNEND

-- Verificacion de fechaif( @fechaI < GETDATE() OR @fechaS < @fechaI )BEGINRAISERROR('Fecha invlida',10,4)ROLLBACK TRANSACTION TransacReservRETURNEND

if @fechaS>@fechaIBEGINif @fechaI>GETDATE()BEGINUPDATE Habitacion set estado = 'Reservada' WHERE HabitacionID = @HabitacionID AND estado = 'Libre'INSERT Reservacion values(@HabitacionID, @fechaI, @fechaS, @HuespedID, 'En espera')ENDelse BEGINUPDATE Habitacion set estado = 'Ocupada' WHERE HabitacionID = @HabitacionID AND estado = 'Libre'INSERT Reservacion values(@HabitacionID, @fechaI, @fechaS, @HuespedID, 'En curso')ENDEND

if @@ERROR=0BEGINPRINT 'Reservacin de la habitacin ' + CAST(@HabitacionID as char(2))+', de tipo '+ @tipo +', realizada correctamente.'COMMIT TRANSACTION TransacReservENDelseBEGINRAISERROR('Ocurri un error con las referencias.' , 10, 4)ROLLBACK TRANSACTION TransacReservENDgo

Insertamos habitaciones para hacer las reservaciones por tipo.

Hacemos dos reservaciones para separar las habitaciones correspondientes segn el tipo de habitacin especificada.

6.4. Procedimiento almacenado para registrar un servicio adicional sobre la reservacin.if OBJECT_ID('InsertarContratoAdicional') is NOT NULLDROP PROCEDURE InsertarContratoAdicionalgo

CREATE PROCEDURE InsertarContratoAdicional(@reservID int,@servID int,@descuento numeric(8,2)) ASBEGIN TRANSACTION TransacContratoAd-- Obtener ID de la reservacinDECLARE @ReservacionID intSELECT @ReservacionID = ReservacionID FROM Reservacion WHERE ReservacionID = @reservID

if @ReservacionID is NULLBEGINRAISERROR('No se encuentr ninguna reservacion con ese cdigo.', 10, 4)ROLLBACK TRANSACTION TransacContratoAdRETURNEND-- Obtener ID del servicioDECLARE @ServicioID intSELECT @ServicioID = ServicioID FROM ServAdicionales WHERE ServicioID = @servID

if @ServicioID is NULLBEGINRAISERROR('No se encuentr ningn servicio con el ID indicado.', 10, 4)ROLLBACK TRANSACTION TransacContratoAdRETURNEND

-- Verificacin del estado de reservacinDECLARE @estReserv varchar(10)SELECT @estReserv = estado FROM ReservacionWHERE ReservacionID = @ReservacionIDif( @estReserv 'En curso' AND @estReserv 'En espera' )BEGINRAISERROR('La reservacin debe estar en curso o en espera.',10,4)ROLLBACK TRANSACTION TransacContratoAdRETURNEND

-- Verificar el valor del descuentoif( @descuento < 0 OR @descuento > 100 )BEGINRAISERROR('El valor del descuento debe ser un nmero entre 0 y 100.',10,4)ROLLBACK TRANSACTION TransacContratoAdRETURNEND

-- InsertarINSERT ContratoAdicional(ReservacionID,ServicioID,dscto)VALUES (@ReservacionID,@ServicioID,@descuento)

if @@ERROR=0BEGINPRINT 'Contratacin del servicio anulada.'COMMIT TRANSACTION TransacContratoAdENDelseBEGINRAISERROR('Ocurri un error con las referencias.' , 10, 4)ROLLBACK TRANSACTION TransacContratoAdENDgo

Listamos las reservaciones para seleccionar una de ellas y asignarle un servicio adicional.

Listamos los servicios adicionales existentes que se pueden asignar.

Ejecutamos el procedimiento para asignar un servicio adicional a una reservacin.

6.5. Procedimiento almacenado para cancelar una reservacin.ALTER TRIGGER CancelarReservacionON [Reservacion] INSTEAD OF UPDATEASBEGINDECLARE @Est_Habitacion varchar(10) -- Estado de la habitacinDECLARE @ID_Habitacion int -- Nro de la habitacin a ser canceladaDECLARE @ID_Reservacion int -- Cdigo de la reservacinDECLARE @Est_Reservacion varchar(10)

SELECT @ID_Habitacion = HabitacionID FROM inserted SELECT @Est_Habitacion = H.estadoFROM Habitacion HWHERE H.HabitacionID = @ID_Habitacion

SELECT @ID_Reservacion = R.ReservacionIDFROM Reservacion RWHERE R.HabitacionID = @ID_Habitacion

SELECT @Est_Reservacion = R.estadoFROM Reservacion RWHERE R.HabitacionID = @ID_Habitacion

/* Revisar que el estado de la reservacion sea "En espera". nico caso en que puede cancelarse.Revisar que la habitacin est "Reservada".*/if ( @Est_Habitacion'Reservada' OR @Est_Reservacion'En espera')RAISERROR('No se puede cancelar una reservacin inexistente o que ya ha empezado.', 10, 4)elseBEGINUPDATE Reservacion SET estado = 'Cancelada'WHERE HabitacionID = @ID_HabitacionUPDATE Habitacion SET estado = 'Libre' WHERE HabitacionID = @ID_HabitacionDELETE FROM ContratoAdicional WHERE ReservacionID = @ID_ReservacionENDENDgo--Fin del Trigger

Listamos las reservaciones existentes

Listamos las habitaciones existentes

Ejecutamos el procedimiento cancelando la habitacin 2, como se puede observar la reservacin de esa habitacin esta cancelada y el estado de la habitacin es Libre.

6.6. Trigger para registrar un nuevo contrato del auditorio.

CREATE TRIGGER InsertarContratoAuditorioON [ContratoAuditorio] INSTEAD OF INSERT ASBEGINDECLARE @DNI char(8)DECLARE @FechaInicio dateDECLARE @duracion intDECLARE @FechaFin date--Obtenemos los datos de la insercionSELECT @DNI = DNI,@FechaInicio = fechaInicio,@duracion = duracion,@FechaFin = DATEADD(day,@duracion,@FechaInicio)from inserted

--Verificacion de una duracion validaif @duracion