Logo Studenta

037 Script-Implementaci-n

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

----------------------------------------
-- Creación de la Base de Datos --
----------------------------------------
CREATE DATABASE Academia;
---------------------------------
-- Usar la Base de Datos --
---------------------------------
USE Academia;
/*-----------------------------------------
Tabla de Paises
	-- Restricción de Nulabilidad
	-- Restricción de Chequeo de Valores
	-- Restricción de Unicidad
	-- Llave Primaria
------------------------------------------*/
CREATE TABLE Paises
(
 --Creamos la Restricción en la misma definicón de la Columna
 Cod_Pais char(2) PRIMARY KEY CHECK (LEN(Cod_Pais)=2), 
 Nombre varchar(50) NOT NULL,							
 Cod_ISO3 char(3) NOT NULL UNIQUE CHECK (LEN(Cod_ISO3)=3),
 Cod_Telefonico smallint
);
/*-----------------------------------------
Tabla de Estados
	-- Llave Foránea
	 -- Acciones sobre la Relación
------------------------------------------*/
CREATE TABLE Estados
(
 Cod_Estado char(2) PRIMARY KEY,
 --Creamos la Restricción como un Objeto separado y le damos nombre.
 CONSTRAINT Len_Estado CHECK (LEN(Cod_Estado)=2), 
 Cod_Pais char(2) FOREIGN KEY REFERENCES Paises (Cod_Pais)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 Nombre varchar(50) NOT NULL,
 Cod_Telefonico smallint
);
/*-----------------------------------------
Tabla de Academias
	-- Campos Auto-Generados
------------------------------------------*/
CREATE TABLE Academias
(
 Cod_Acad tinyint IDENTITY (1,1) PRIMARY KEY,
 Nombre varchar(50) NOT NULL,
 Fec_Fundacion Date NOT NULL,
 Numero varchar(10) NOT NULL,
 Calle varchar(30) NOT NULL,
 Ciudad varchar(30) NOT NULL,
 Estado char(2) NULL 
 --Si deseamos Agregar un Nombre 
	CONSTRAINT FK_Academias_Estados FOREIGN KEY 
									REFERENCES Estados (Cod_Estado)
										ON UPDATE CASCADE
										ON DELETE SET NULL,
 Cod_Postal varchar(10)
);
/*---------------------------------------------
Tabla de Departamentos
	-- Referencia a una tabla que no existe
---------------------------------------------*/
CREATE TABLE Departamentos
(
 Cod_Dpto Smallint IDENTITY (1,1) PRIMARY KEY,
 Academia tinyint NOT NULL 
			FOREIGN KEY REFERENCES Academias (Cod_Acad)
				ON UPDATE CASCADE
				ON DELETE CASCADE,
 Nombre varchar(30) NOT NULL,
 Director smallint NOT NULL DEFAULT (-1)
			--La Tabla Profesores aun no existe
			FOREIGN KEY REFERENCES Profesores (Cod_Prof) 
				ON UPDATE NO ACTION
				ON DELETE NO ACTION,
 Fec_Inicio Date NOT NULL
);
/*-----------------------------------------
Tabla de Profesores
------------------------------------------*/
CREATE TABLE Profesores
(
 Cod_Prof smallint IDENTITY (1,1) PRIMARY KEY,
 SSN varchar(11) UNIQUE CHECK (LEN(SSN)=11),
 Nombre varchar(30) NOT NULL,
 Apellido varchar(30) NOT NULL,
 Numero varchar(10) NOT NULL,
 Calle varchar(30) NOT NULL,
 Ciudad varchar(30) NOT NULL,
 Estado char(2) FOREIGN KEY REFERENCES Estados (Cod_Estado)
 ON UPDATE CASCADE
 ON DELETE SET NULL,
 Cod_Postal varchar(10) NOT NULL,
 Telefono varchar(15),
 Sueldo money DEFAULT (0)
);
/*---------------------------------------------
Tabla de Departamentos
	-- Ahora si existe la Referencia
---------------------------------------------*/
CREATE TABLE Departamentos
(
 Cod_Dpto Smallint IDENTITY (1,1) PRIMARY KEY,
 Academia tinyint NOT NULL 
			FOREIGN KEY REFERENCES Academias (Cod_Acad)
				ON UPDATE CASCADE
				ON DELETE CASCADE,
 Nombre varchar(30) NOT NULL,
 Director smallint NOT NULL DEFAULT (-1)
			FOREIGN KEY REFERENCES Profesores (Cod_Prof)
				ON UPDATE NO ACTION
				ON DELETE NO ACTION,
 Fec_Inicio Date NOT NULL
);
/*---------------------------------------------------
Tabla de Relación entre Departamentos y Profesores
 --Falla en la Creación de la Llave Foránea 
 con Departamentos
---------------------------------------------------*/
CREATE TABLE Dptos_Profesores
(
 Cod_Dpto Smallint NOT NULL
	FOREIGN KEY REFERENCES Departamentos (Cod_Dpto)
	 ON UPDATE CASCADE
		ON DELETE CASCADE,
 Cod_Prof smallint NOT NULL
	FOREIGN KEY REFERENCES Profesores (Cod_Prof)
	 ON UPDATE CASCADE
		ON DELETE CASCADE
);
/*---------------------------------------------------
 Eliminamos los eventos en Cascada
---------------------------------------------------*/
CREATE TABLE Dptos_Profesores
(
 Cod_Dpto Smallint NOT NULL
	FOREIGN KEY REFERENCES Departamentos (Cod_Dpto),
 Cod_Prof smallint NOT NULL
	FOREIGN KEY REFERENCES Profesores (Cod_Prof)
	 ON UPDATE CASCADE
		ON DELETE CASCADE
);
/*-----------------------------------------------------
 Manejamos el Comportamiento deseado con un trigger
-----------------------------------------------------*/
CREATE TRIGGER trg_Borrar_Dptos_Profesores
 ON Departamentos
 FOR DELETE --->Borrado de Departamentos
AS 
BEGIN
	DELETE	Dptos_Profesores
	WHERE	Cod_Dpto IN (
						SELECT	Cod_Dpto
						FROM	DELETED
						);
END;
/*--------------------------------------------
 La situación de modificación 
 es más complicada 
--------------------------------------------*/
CREATE TRIGGER trg_Modificar_Dptos_Profesores
 ON Departamentos
 FOR UPDATE --->Modificación de Departamentos
AS 
BEGIN
	UPDATE	Dptos_Profesores
	SET		Cod_Dpto = A.Cod_Nuevo -->Actualicemos al Nuevo Código
	FROM	(
				SELECT	D.Cod_Dpto AS Cod_Anterior,
						I.Cod_Dpto AS Cod_Nuevo
				FROM	DELETED D ---> Datos Antes de la Modificación
						JOIN 
						INSERTED I ---> Datos Después de la Modificación 
						ON 
						D.Cod_Dpto = I.Cod_Dpto -->Del mismo Departamento
			) A
	WHERE	Cod_Dpto = A.Cod_Anterior; -->Las filas que tengan el Código Anterior de cada Dpto
END;
/*---------------------------------------------------
Tabla de Materias
 --Falla en la Creación de la Restricción.
 No se puede usar un campo del mismo registro 
---------------------------------------------------*/
CREATE TABLE Materias
(
 Cod_Materia Smallint IDENTITY (1,1) PRIMARY KEY,
 Nombre varchar(30) NOT NULL,
 Electiva bit NOT NULL DEFAULT (0),
 Peso tinyint CHECK ( Peso > 0 AND 
					 Peso < (CASE Electiva 
					 WHEN 0 THEN 6 
								 ELSE 2 
							 END)
				 )
);
/*---------------------------------------------------
 Creamos la tabla sin la Restricción
---------------------------------------------------*/
CREATE TABLE Materias
(
 Cod_Materia Smallint IDENTITY (1,1) PRIMARY KEY,
 Nombre varchar(30) NOT NULL,
 Electiva bit NOT NULL DEFAULT (0),
 Peso tinyint NOT NULL DEFAULT (1) CHECK (Peso > 0) 
 --Una Restricción
);
/*---------------------------------------------------
 Creamos la Restricción, pero a nivel de la Tabla
 y no del campo Peso
---------------------------------------------------*/
ALTER TABLE Materias
 ADD CONSTRAINT CheckPesoMateria
	CHECK ( Peso <= (CASE Electiva WHEN 0 THEN 6 ELSE 2 END));
/*---------------------------------------------------
Tabla de Cursos
	--Campo Calculado
---------------------------------------------------*/
CREATE TABLE Cursos
(
 Cod_Curso int IDENTITY (1,1) PRIMARY KEY,
 Cod_Prof smallint
	FOREIGN KEY REFERENCES Profesores (Cod_Prof)
		ON DELETE SET NULL,
 Cod_Materia Smallint
 FOREIGN KEY REFERENCES Materias (Cod_Materia)
		ON DELETE CASCADE,
 Aula int NOT NULL,
 Hora_Inicio time NOT NULL,
 Hora_Fin time NOT NULL,
 Duracion_Mins AS (DATEDIFF(MINUTE, Hora_Inicio, Hora_Fin)) 
 --No se define el Tipo del Dato
);
/*---------------------------------------------------
 Creamos Restricción a nivel de la Tabla
---------------------------------------------------*/
ALTER TABLE Cursos
 ADD CONSTRAINT CheckHoras
	CHECK (Hora_Inicio < Hora_Fin);
/*---------------------------------------------------
Agreguemos un nuevo campo a la Tabla
---------------------------------------------------*/
ALTER TABLE Cursos
 ADD Activo BIT NOT NULL DEFAULT (1);
/*---------------------------------------------------
 Función para chequear si un Aula está ocupada
---------------------------------------------------*/
CREATE FUNCTION fn_Aula_Ocupada 
(
	----Parámetros:
	-- Datos del Registro que se está Insertando
	@ID INT, 
	@Aula INT, 
	@Inicio Time, 
	@Fin Time
)
RETURNS bit --La función retornará un bit (0 / 1)
AS
BEGIN
	DECLARE @AulaOcupada BIT = 0; --Asumamos de una vez que el Aula NO está ocupada
	-- EXISTS (conjunto) devuelve 0 si el conjunto es vacío y 1 si existe almenos 1 elemento.
	-- En realidad el SELECT que define al conjunto, NO se ejecuta, simplemente se revisa
	--	 si existe almenos 1 registro que cumpla con las condiciones suministradas
	IF EXISTS	(
				SELECT	*						-- Seleccionemos
				FROM	Cursos					-- los cursos que cumplan con las siguientes condiciones:
				WHERE	Cod_Curso <> @ID AND	-- 1) No es el curso que estamos tratando de Insertar
						Aula = @Aula AND		-- 2) El curso se dicta en la misma Aula
						Activo = 1 AND			-- 3) y es un curso Activo
						(
							-- 4) El curso se está dictando en el momento que inicia el curso que queremos Insertar
							@Inicio BETWEEN Hora_Inicio AND Hora_Fin OR
							-- 5) El curso se está dictando en el momento que finaliza el curso que queremos Insertar
							@Fin BETWEEN Hora_Inicio AND Hora_Fin OR
							-- 5) El curso se está dictando mintras se debe dictar el curso que queremos Insertar
							(@Inicio <= Hora_Inicio AND @Fin >= Hora_Fin)
						)
				)
		SET @AulaOcupada = 1; --Si existe algún curso que cumpla las condiciones establecidas,
							 --entonces el aula está ocupada.
	RETURN @AulaOcupada; -- Retornemos el valor resultante.
END;
/*-----------------------------------------------------------
 Creamos la Restricción
 --Sólo se pueden crear cursos, si el aula está disponible
-----------------------------------------------------------*/
ALTER TABLE Cursos
 ADD CONSTRAINT CheckAulaOcupada
	CHECK (dbo.fn_Aula_Ocupada (Cod_Curso,Aula,Hora_Inicio,Hora_Fin)=0);
/*---------------------------------------------------
Tabla de Libros
---------------------------------------------------*/
CREATE TABLE Libros
(
 Cod_Libro int IDENTITY (1,1) PRIMARY KEY,
 ISBN char(13) NOT NULL UNIQUE CHECK (LEN(ISBN)=13 AND ISNUMERIC(ISBN)=1),
 Titulo varchar(100) NOT NULL,
 Autor varchar(100) NOT NULL,
 Año smallint,
 Edicion char(3),
 Editorial varchar(100),
 Paginas smallint
);
/*---------------------------------------------------
Tabla de Relación Cursos y Libros
---------------------------------------------------*/
CREATE TABLE Cursos_Libros
(
 Cod_Curso int NOT NULL
		FOREIGN KEY REFERENCES Cursos (Cod_Curso)
		 ON UPDATE CASCADE
			ON DELETE CASCADE,
 Cod_Libro int NOT NULL
		FOREIGN KEY REFERENCES Libros (Cod_Libro)
		 ON UPDATE CASCADE
			ON DELETE CASCADE
);
/*---------------------------------------------------
Tabla de Alumnos
---------------------------------------------------*/
CREATE TABLE Alumnos
(
 Cod_Alumno int IDENTITY (1,1) PRIMARY KEY,
 SSN varchar(11) UNIQUE CHECK (LEN(SSN)=11),
 Nombre varchar(30) NOT NULL,
 Apellido varchar(30) NOT NULL,
 Numero varchar(10) NOT NULL,
 Calle varchar(30) NOT NULL,
 Ciudad varchar(30) NOT NULL,
 Estado char(2) FOREIGN KEY REFERENCES Estados (Cod_Estado)
 ON UPDATE CASCADE
 ON DELETE SET NULL,
 Cod_Postal varchar(10) NOT NULL,
 Telefono varchar(15),
 Fecha_Nac Date,
 Lugar_Nac varchar(50)
);
/*---------------------------------------------------
Tabla de Relación Cursos y Alumnos
	--Llave Primaria Compuesta
---------------------------------------------------*/
CREATE TABLE Cursos_Alumnos
(
 Cod_Alumno int
	FOREIGN KEY REFERENCES Alumnos (Cod_Alumno)
 ON UPDATE CASCADE
 ON DELETE CASCADE, 
 Cod_Curso int
	FOREIGN KEY REFERENCES Cursos (Cod_Curso)
 ON UPDATE CASCADE
 ON DELETE CASCADE, 
 PRIMARY KEY (Cod_Alumno, Cod_Curso),
 Calificacion tinyint,
 Fecha_Insc Date,
 Ausencias tinyint
);
-----Creemos el Diagrama-----

Continuar navegando