Vous êtes sur la page 1sur 17

Laboratorio 03

ALUMNO _________________________________________________

TEMA TRIGGERS
OBJETIVOS

Triggers en PostgreSQL
Tipos de Triggers
Estructura de los triggers

REQUERIMIENTOS

PC con Windows 2000 o XP o Linux y PostgreSQL instalado

PROCEDIMIENTO

I. TRIGGERS
DESCRIPCIN DE LA BASE DE DATOS EJEMPLO
OBJETIVOS
Implementar una base de datos que permita llevar un registro de matrculas y notas
acerca de los cursos que se dictan en una institucin particular
DESCRIPCIN
Se nos ha encargado disear una base de datos para una institucin educativa
particular que se dedica a la capacitacin exclusiva de personas que trabajan en las
distintas empresas de nuestra regin, los trabajadores tienen la libertad de elegir los
cursos que ellos prefieran ya que al finalizar un curso ellos podran tener un certificado
emitido por la institucin educativa y avalado por el Ministerio de Trabajo el cual tendr
un valor especial para el currculum de cada trabajador y as mismo las empresas
podrn garantizar el nivel de conocimientos y competencias de sus trabajadores.
REQUERIMIENTOS
Se debe tener un registro de todas las empresas cuyo personal podr ser
capacitado
Se debe llevar un registro de los trabajadores-alumnos, especificando la empresa a
la cual pertenecen
Se debe tener un registro de los diversos cursos que sean programados por la
institucin educativa
Se debe tener un registro del personal encargado de realizar el registro de las
matrculas de los trabajadores en los diversos cursos programados
nicamente tendrn validez para los trabajadores aquellos cursos que sean
aprobados
La modalidad de evaluacin de cada curso implicar el registro de tres notas y el
promedio final ser igual al promedio de dichas tres notas
En caso de haber desaprobado un curso un trabajador podr solicitar una
constancia de asistencia siempre y cuando haya cumplido con un 75% de
asistencias al curso
MODELO FSICO DE LA BASE DE DATOS PROPUESTA

TPERSONAL TCURSOS TALUMNOS TEMPRESAS


(TRABAJAD.)

TMATRICULAS
II. IMPLEMENTAR LA BASE DE DATOS PROPUESTA
1. Desde la herramienta pgAdmin III crearemos la base de datos de nombre
DBCAPACITA. Anote el procedimiento seguido

2. Crearemos las tablas de la base de datos DBCAPACITA. Los siguientes comandos


SQL permiten crear las tablas. Consulte con el instructor para que le indique la
forma de obtener el archivo SQL conteniendo los comandos SQL anteriores y luego
ejecute cada sentencia desde la herramienta pgAdmin Query Tool:. (Nota: Tenga
cuidado de crear las tablas en la base de datos DBCAPACITA)
CREATE TABLE TPERSONAL (
COD_PER INT NOT NULL,
NOM_PER VARCHAR(30) NOT NULL,
CLA_PER VARCHAR(15) NOT NULL,
EST_PER VARCHAR( 1) NOT NULL,
CONSTRAINT PK_PERSONAL PRIMARY KEY (COD_PER),
CONSTRAINT CK_PERSONAL_EST CHECK (EST_PER IN ('A','X'))
);

CREATE TABLE TEMPRESAS (


COD_EMP INT NOT NULL,
NOM_EMP VARCHAR(30) NOT NULL,
DIR_EMP VARCHAR(50) NOT NULL,
FON_EMP VARCHAR(12) NOT NULL,
EST_EMP VARCHAR( 1) NOT NULL,
CONSTRAINT PK_TEMPRESAS PRIMARY KEY (COD_EMP),
CONSTRAINT CK_TEMPRESAS_EST CHECK (EST_EMP IN ('A','X'))
);

CREATE TABLE TCURSOS (


COD_CUR INT NOT NULL,
NOM_CUR VARCHAR(30) NOT NULL,
COSTO_CUR DECIMAL(12,2) NOT NULL,
FEC_INI DATE,
FEC_FIN DATE,
NRO_HOR INT NOT NULL,
NRO_VAC INT NOT NULL,
NRO_INS INT NOT NULL,
EST_CUR VARCHAR( 1) NOT NULL,
CONSTRAINT PK_TCURSOS PRIMARY KEY (COD_CUR),
CONSTRAINT CK_TCURSOS_HOR CHECK (NRO_HOR > 0),
CONSTRAINT CK_TCURSOS_VAC CHECK (NRO_VAC >=0),
CONSTRAINT CK_TCURSOS_INS CHECK (NRO_INS >=0),
CONSTRAINT CK_TCURSOS_EST CHECK (EST_CUR IN ('A','X'))
);

CREATE TABLE TALUMNOS (


COD_ALU INT NOT NULL,
NOM_ALU VARCHAR(30) NOT NULL,
DIR_ALU VARCHAR(30) NOT NULL,
SEX_ALU VARCHAR( 1) NOT NULL,
FEC_NAC DATE,
FON_ALU VARCHAR(12),
EST_ALU VARCHAR( 1) NOT NULL,
COD_EMP INT NOT NULL,
CONSTRAINT PK_TALUMNOS PRIMARY KEY (COD_ALU),
CONSTRAINT CK_TALUMNOS_SEX CHECK (SEX_ALU IN ('M','F','-')),
CONSTRAINT CK_TALUMNOS_EST CHECK (EST_ALU IN ('A','X')),
CONSTRAINT FK_TALUMNOS_TEMPRESAS FOREIGN KEY (COD_EMP)
REFERENCES TEMPRESAS (COD_EMP)
);

CREATE TABLE TMATRICULAS (


COD_ALU INT NOT NULL,
COD_CUR INT NOT NULL,
FEC_MAT DATE NOT NULL,
NRO_DOC VARCHAR(15) NOT NULL,
MON_MAT DECIMAL(12,2) NOT NULL,
NRO_ASI INT,
N1 INT,
N2 INT,
N3 INT,
PR INT,
EST_MAT VARCHAR( 1) NOT NULL,
COD_PER INT NOT NULL,
CONSTRAINT PK_TMATRICULAS PRIMARY KEY (COD_ALU,COD_CUR),
CONSTRAINT CK_TMATRICULAS_MON CHECK (MON_MAT >= 0),
CONSTRAINT CK_TMATRICULAS_ASI CHECK (NRO_ASI BETWEEN 0 AND 20),
CONSTRAINT CK_TMATRICULAS_N1 CHECK (N1 BETWEEN 0 AND 20),
CONSTRAINT CK_TMATRICULAS_N2 CHECK (N2 BETWEEN 0 AND 20),
CONSTRAINT CK_TMATRICULAS_N3 CHECK (N3 BETWEEN 0 AND 20),
CONSTRAINT CK_TMATRICULAS_PR CHECK (PR BETWEEN 0 AND 20),
CONSTRAINT CK_TMATRICULAS CHECK (EST_MAT IN ('A','X')),
CONSTRAINT FK_TMATRICULAS_TALUMNOS FOREIGN KEY (COD_ALU)
REFERENCES TALUMNOS (COD_ALU),
CONSTRAINT FK_TMATRICULAS_TCURSOS FOREIGN KEY (COD_CUR)
REFERENCES TCURSOS (COD_CUR),
CONSTRAINT FK_TMATRICULAS_TPERSONA FOREIGN KEY (COD_PER)
REFERENCES TPERSONAL(COD_PER)
);
3. Anote a continuacin cualquier detalle que sea importante relacionado al proceso de
creacin de las tablas anteriores:

4. Para la generacin automtica de cdigos en las tablas TCURSOS, TALUMNOS y


TEMPRESAS emplearemos objetos de base de datos denominados secuencias
cuyos nombres y definiciones se muestran en la siguiente tabla:
Nombre Secuencia Valor Incremento Propietario Descripcin
Inicial
seq_cod_alu 1001 1 postgres Secuencia para la tabla talumnos
seq_cod_cur 1001 1 postgres Secuencia para la tabla tcursos
seq_cod_emp 1001 1 postgres Secuencia para la tabla tempresas

5. La siguiente figura muestra los datos necesarios para crear la secuencia


seq_cod_alu
6. Segn el esquema anterior complete la creacin de las secuencias faltantes. Anote a
continuacin cualquier detalle que considere importante

7. La tabla TPERSONAL requiere que se almacene la clave de cada persona, para ello
ser necesario implementar dos funciones, una funcin que permita encriptar la
contrasea y otra que desencripte una contrasea encriptada previamente.
Emplearemos un algoritmo simple, el cual consistir en invertir primero la cadena
original y luego que sume el valor 1 al cdigo ASCII de cada carcter de la contrasea
para encriptarla, aplicaremos el proceso inverso para desencriptarla
CREATE OR REPLACE FUNCTION f_encriptar(varchar) RETURNS varchar AS
'declare
p_clave alias for $1;
x_cont int4 := 1;
x_clave varchar(15) := '';
x_letra varchar(1);
begin
while x_cont <= length( p_clave ) loop
x_letra:= substring(p_clave,x_cont,1);
x_clave:= chr( ascii(x_letra) + 1 ) || x_clave;
x_cont := x_cont + 1;
end loop;
return x_clave;
end;
' LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION f_desencriptar(varchar) RETURNS varchar AS '
declare
p_clave alias for $1;
x_clave varchar(15) := '';
x_cont int4 := 1;
x_letra varchar(1);
begin
while x_cont <= length(p_clave ) loop
x_letra:= substring(p_clave, x_cont, 1);
x_clave:= chr( ascii( x_letra ) - 1 ) || x_clave;
x_cont := x_cont + 1;
end loop;
return x_clave;
end;
' LANGUAGE 'plpgsql';
8. Implemente algunas sentencias SQL que permitan verificar la correcta operacin de
las funciones anteriores

IMPLEMENTAR TRIGGERS EN LA BASE DE DATOS PROPUESTA


9. REQUERIMIENTO: A cada empresa nueva se le debe asignar un cdigo numrico
nico.
SOLUCIN: Crearemos un trigger a la tabla TEMPRESAS de tal forma que al
insertar un registro en la tabla obtendremos el valor del nuevo cdigo de la secuencia
seq_cod_emp y lo insertaremos en dicho registro.
DATO VALOR
TABLA TEMPRESAS
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA
10. La creacin de los triggers en PostgreSQL se realiza en dos etapas. Primera etapa:
Definicin de una funcin de tipo trigger donde se almacena la lgica del trigger.
Segunda etapa, asociar la funcin de tipo trigger anterior a la tabla involucrada. A
continuacin mostramos el cdigo del trigger: (Primera etapa)

11. A continuacin mostramos el cdigo que permite asociar el trigger a la tabla


tempresas: (Segunda etapa)
12. A continuacin mostramos los esquemas que permiten implementar las dos etapas de
creacin de un trigger grficamente desde la herramienta pgAdmin III

Primera etapa:
Segunda etapa:
13. REQUERIMIENTO: A cada alumno nuevo se le debe asignar un cdigo numrico
nico.
SOLUCIN: Crearemos un trigger a la tabla TALUMNOS de tal forma que al insertar
un registro en la tabla obtendremos el valor del nuevo cdigo de la secuencia
seq_cod_alu y lo insertaremos en dicho registro. A continuacin se muestra el cdigo
resultante

14. A continuacin mostramos el cdigo que permite asociar el trigger a la tabla talumnos:
(Segunda etapa)

15. REQUERIMIENTO: A cada curso nuevo se le debe asignar un cdigo numrico nico.
SOLUCIN: Crearemos un trigger a la tabla TCURSOS de tal forma que al insertar
un registro en la tabla obtendremos el valor del nuevo cdigo de la secuencia
seq_cod_cur y lo insertaremos en dicho registro. Anote a continuacin el cdigo
resultante:

16. Anote a continuacin el cdigo que permite asociar el trigger a la tabla tcursos:
(Segunda etapa)
17. A continuacin proceda a insertar registros a las tablas TCURSOS, TEMPRESAS y
TALUMNOS, verifique luego el efecto de la accin de los triggers creados. Anote los
detalles que considere ms importantes

18. Para que sirve la estructura o registro NEW empleada en los ejemplos anteriores?
Explique

19. REQUERIMIENTO: Al crear un nuevo registro en la tabla TPERSONAL se debe


almacenar como contrasea inicial un valor igual al cdigo del usuario, la cual se
almacenar en forma encriptada.
SOLUCIN: Crearemos un trigger a la tabla TPERSONAL de tal forma que al insertar
un registro en la tabla obtendremos el cdigo generado para el usuario, luego
procederemos a encriptarlo y finalmente lo almacenaremos en el campo clave de la
tabla TPERSONAL
DATO VALOR
TABLA TPERSONAL
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA
20. Para verificar la ejecucin del trigger anterior adicione algunos registros a la tabla
tpersonal. Anote cualquier observacin que considere importante:

21. REQUERIMIENTO: Cada vez que se cambie la clave de un usuario en la tabla


TPERSONAL se debe almacenar la nueva contrasea en forma encriptada.
SOLUCIN: Crearemos un trigger a la tabla TPERSONAL de tal forma que al
actualizar el campo clave de un registro se encripte previamente el valor de la nueva
clave y se almacene el valor encriptado en la tabla en el registro correcto. El trigger se
debe ejecutar nicamente si se modifica el campo CLA_PER
DATO VALOR
TABLA TPERSONAL
EVENTO UPDATE
TIEMPO ANTES (BEFORE)
NIVEL FILA
22. Intente modificar la contrasea de algunos usuarios en la tabla TPersonal y verifique
la operacin adecuada del trigger. Anote a continuacin cualquier detalle que
considere importante:

23. REQUERIMIENTO: Cada curso nuevo que se registre debe empezar con el campo
nmero de inscritos en 0.
SOLUCIN: Modificaremos la funcin asociada al trigger para el evento INSERT de
la tabla TCURSOS de tal forma que se inicialice el campo NRO_INS en cero en dicha
tabla para el nuevo registro agregado.
DATO VALOR
TABLA TCURSOS
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA

Anote a continuacin el cdigo de la funcin despus de haber realizado la


modificacin propuesta en el enunciado de la solucin

24. Adicione algunos cursos a la tabla TCURSOS y verifique la ejecucin del trigger
modificado. Anote a continuacin todos los detalles que considere importantes

25. REQUERIMIENTO: Al crear un nuevo registro en la tabla TMATRICULAS se debe


almacenar 0 en los campos: NRO_ASI, N1, N2, N3 y PR. Esto debe ser as, ya que
cuando un alumno se matricula significa que no debe tener ningn registro de notas ni
de asistencia
SOLUCIN: Crearemos un trigger a la tabla TMATRICULAS de tal forma que al
insertar un registro en la tabla, se inicializar en CERO los campos mencionados en
el requerimiento a travs de la variable NEW, como se muestra en el codigo siguiente:
DATO VALOR
TABLA TMATRICULAS
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA
26. Adicione algunos registros a la tabla TMATRICULAS y verifique la ejecucin del
trigger creado. Anote a continuacin todos los detalles que considere importantes

27. REQUERIMIENTO: Cada vez que se modifique el valor de uno de los campos N1, N2
o N3 de cualquier registro de la tabla TMATRICULAS se debe calcular el valor de la
nota promedio para dicho registro
SOLUCIN: Crearemos un trigger a la tabla TMATRICULAS de tal forma que al
modificar uno de los campos N1,N2 o N3 de un registro en la tabla realizaremos
nuevamente el clculo del promedio:
DATO VALOR
TABLA TMATRICULAS
EVENTO UPDATE
TIEMPO ANTES (BEFORE)
NIVEL FILA
28. Modifique algunas notas de algunos registros en la tabla TMATRICULAS y verifique la
ejecucin del trigger creado.
29. REQUERIMIENTO: Se debe llevar un control de la cantidad de alumnos matriculados
por curso para evitar sobrepasar el nmero de vacantes.
SOLUCIN: Crearemos un trigger a la tabla TMATRICULAS de tal forma que al
insertar una nueva matrcula se verifique si existe vacantes en el curso referenciado
sino se debe cancelar el registro, si procede la matrcula debemos sumar UNO al
campo NRO_INS de la tabla TCURSOS para el curso requerido:
DATO VALOR
TABLA TMATRICULAS
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA
30. Adicione algunos registros a la tabla TMATRICULAS y verifique la ejecucin de los
dos triggers creados a la fecha para el evento insert. Anote a continuacin todos los
detalles que considere importantes

31. REQUERIMIENTO: Se debe permitir realizar modificaciones de matrculas


relacionadas a cambios de cursos siempre y cuando el nuevo curso a registrar tenga
un costo igual o menor al monto que pag el participante por el curso que desea
abandonar. No se realizar ninguna devolucin de saldos que se puedan generar
producto del cambio de matrcula
SOLUCIN: Crearemos un trigger a la tabla TMATRICULAS de tal forma que al
modificar el cdigo del curso se verifique primeramente que existan vacantes en el
nuevo curso y que el costo de dicho curso sea menor o igual que el monto pagado
por el alumno. Como no se realizar ninguna devolucin de dinero, entonces el monto
de la matrcula no debe cambiar:

DATO VALOR
TABLA TMATRICULAS
EVENTO UPDATE
TIEMPO ANTES (BEFORE)
NIVEL FILA
32. Modifique algunos registros de la tabla TMATRICULAS y verifique la ejecucin de los
dos triggers creados a la fecha para el evento update. Realice modificaciones de
cdigos de cursos a matrculas especficas y luego verifique el contenido de las tablas
TCURSOS y TMATRICULAS. Anote a continuacin todos los detalles que considere
importantes

33. REQUERIMIENTO: No se debe permitir que un trabajador se matricule en mas de un


curso que empiece en el mismo mes. Adems se debe aplicar un descuento
automtico equivalente al 20% del monto que debera pagar si el trabajador ha
llevado mas de dos cursos durante el presente ao y los ha aprobado todos los
cursos.
SOLUCIN: Crearemos un trigger a la tabla TMATRICULAS de tal forma que al
insertar un registro verifique si el trabajador ya se encuentra matriculado en cualquier
otro curso que empieza el mismo mes que el curso en el cual se intenta matricular,
adems se debe contar en cuantos cursos se ha matriculado el presente ao, si ha
llevado mas de dos cursos se debe aplicar el descuento del 20% del monto pero
nicamente si ha aprobado dichos cursos:

DATO VALOR
TABLA TMATRICULAS
EVENTO INSERT
TIEMPO ANTES (BEFORE)
NIVEL FILA

Adicione algunos registros a la tabla TMATRICULAS y verifique la ejecucin de todos


los triggers creados a la fecha para el evento insert. Anote a continuacin todos los
detalles que considere importantes
TAREA
DESCRIPCION

Se ha decidido realizar un campeonato interno de tenis de mesa entre todos los integrantes del
Programa Integral de Desarrollo de Aplicaciones Web (es decir, participan nicamente los alumnos
de nuestro saln). Para ello se requiere implementar una pequea base de datos que permita
registrar la informacin de dicho evento, a continuacin se detallan los requerimientos para la
base de datos:

REQUERIMIENTOS
Llevar un registro de los participantes del saln
Registrar los diferentes encuentros de tenis teniendo en cuenta que en cada partido
deben participar tres personas. Dos contrincantes y un juez
Los contrincantes y el juez de cada partido estarn conformados exclusivamente por
alumnos del saln
En cada partido debe haber un ganador
No se debe permitir registrar como Juez y Jugador a una misma persona al mismo
tiempo
MODELO FISICO DE LA BASE DE DATOS

TALUMNOS TPARTIDOS

IMPLEMENTAR LA BASE DE DATOS PROPUESTA


Crear la base de datos de nombre DBJUEGO
_______________________________________________________________
_____________

Creacin de las tablas de la base de datos


CREATE TABLE TALUMNOS (
COD_ALU VARCHAR(5) NOT NULL,
NOM_ALU VARCHAR(30) NOT NULL,
SEX_ALU VARCHAR( 1) NOT NULL,
FEC_NAC DATE,
EST_ALU VARCHAR( 1) NOT NULL,
CONSTRAINT PK_TALUMNOS PRIMARY KEY (COD_ALU),
CONSTRAINT CK_TALUMNOS_SEX CHECK (SEX_ALU IN ('M','F','-')),
CONSTRAINT CK_TALUMNOS_EST CHECK (EST_ALU IN ('A','X'))
)

CREATE TABLE TPARTIDOS (


COD_PAR INT NOT NULL,
FEC_PAR DATE NOT NULL,
NRO_MESA INT NOT NULL,
COD_AL1 VARCHAR(5) NOT NULL,
COD_AL2 VARCHAR(5) NOT NULL,
COD_JUE VARCHAR(5) NOT NULL,
COD_GAN VARCHAR(5),
EST_PAR VARCHAR( 1) NOT NULL,
CONSTRAINT PK_TPARTIDOS PRIMARY KEY (COD_PAR),
CONSTRAINT CK_TPARTIDOS_EST CHECK (EST_PAR IN ('A','X')),
CONSTRAINT FK_TPARTIDOS_TALU1 FOREIGN KEY (COD_AL1)
REFERENCES TALUMNOS (COD_ALU),
CONSTRAINT FK_TPARTIDOS_TALU2 FOREIGN KEY (COD_AL2)
REFERENCES TALUMNOS (COD_ALU),
CONSTRAINT FK_TPARTIDOS_TJUEZ FOREIGN KEY (COD_JUE)
REFERENCES TALUMNOS (COD_ALU),
CONSTRAINT FK_TPARTIDOS_TGANA FOREIGN KEY (COD_GAN)
REFERENCES TALUMNOS (COD_ALU)
)
Implementar un trigger que no permita registrar en un mismo partido a un mismo
participante mas de una vez

Implementar un trigger que no permita registrar a un participante en mas de dos


partidos en el mismo da en calidad de jugador, en calidad de juez si puede participar
en varios partidos
Implementar un procedimiento almacenado que permita generar una tabla permanente
de nombre tp_resultados que contenga un resumen con la siguiente informacin:
NOMBRE PARTIDOS PARTIDOS PARTIDOS PARTIDOS.
JUGADOS GANADOS PERDIDOS DIRIGIDOS
ALFREDO RAMOS YABARRENA 20 8 12 6
...

OBSERVACIONES Y CONCLUSIONES

Vous aimerez peut-être aussi