Administración de Base de Datos Con PostgreSql LAB 3
Administración de Base de Datos Con PostgreSql LAB 3
Administración de Base de Datos Con PostgreSql LAB 3
Postgres tiene algunas interfaces cliente como Perl, Tcl, Python y C, así como
dos lenguajes Procedimentales (PL). También es posible llamar a funciones C
como acciones disparador. Actualmente es posible especificar BEFORE o
AFTER en los INSERT, DELETE o UPDATE de un registro como un evento de
disparo.
Creación de Disparadores
1
<PROCEDURE NAME> Es la función invocada cuando se ejecute el
disparador. Esta función puede ser escrita en cualquier de los lenguaje
procedimentales o las interfaces cliente que maneja PostgreSQL.
Note que no hay inicialización por parte del manejador CREATE TRIGGER.
Además, si más de un disparador es definido para el mismo evento en la
misma relación, el orden de su ejecución es impredecible. Si una función de
disparo ejecuta consultas SQL, entonces estas funciones pueden disparar a
otros disparadores. Esto es conocido como disparos en cascada. No hay
ninguna limitación explicita en cuanto al número de niveles de cascada.
2
solo al ocurrir un evento que las viole, un valor nulo en un campo con NOT
NULL, etc.
Con los disparadores se intenta dar más control al programador sobre los
eventos que desencadenan un elemento activo, se les conoce en inglés como
reglas ECA (event-condition-action). Es por ello que los disparadores tienen
una clausula BEFORE, AFTER o INSTEAD y bajo que evento (INSERT,
UPDATE, DELETE) pero de esta forma el disparador se ejecutará para cada
tupla (o fila) sometido al evento (clausula FOR EACH ROW) pero el estándar
dicta que puede ser también FOR EACH SENTENCE. Esto provoca que se
ejecute el disparador para toda la relación (o tabla) para la cual se define
(clausula ON).
La diferencia para los que lo han programado, por ejemplo en plpgsql, queda
clara entonces: cuando es FOR EACH ROW en la función pgsql que
implementa el disparador se tiene un objeto NEW y uno OLD que se refiere a la
tupla completa, en el disparador de oraciones (statement) tiene un objeto NEW
y OLD que son la relación completa. Está claro entonces que es un poco más
difícil implementar un disparador para oraciones que para una fila.
Para aplicar los disparadores a nuestra base de datos tenemos que hacer un
ligero cambio en la base de datos. Este cambio consiste en que al momento de
pagar un alumno su inscripción a un curso extracurricular se le debe preguntar
el idcurso al que se va a inscribir, relacionarlo con el folio y consecutivo del
detalle del recibo en el que ha pagado el mismo y automáticamente se debe de
incrementar el campo Total Recabado en la tabla Cursos Especiales, esto con
el fin de que el DCE vea el ingreso económico de este curso. La figura 2
muestra solo la pequeña modificación que debe hacerse al diagrama. Las
entidades y relaciones coloreadas en rojo son las únicas modificaciones de
este diagrama, las demás entidades permanecen intactas y solo se han
incluido para referencia.
3
El problema consiste que cuando se detecte que el alumno Juan Pérez ha
pagado el concepto 50 (pago de cursos especiales) por el Curso 75, el cual es
un curso extracurricular de Java Básico y que será impartido del 10 al 30 de
Enero del 2008 y por el cual va a pagar $4,500 pesos. En el momento en el que
el Recibo y el Detalle del Recibo se actualicen, también se actualizará la
tabla PagoCursoEspecial, entonces automáticamente se debe de incrementar
el importe recabado para el curso que se ha pagado en la
tabla CursosEspeciales. Asimismo, si el recibo es cancelado, entonces el
importe recabado en la tabla CursosEspeciales debe ser disminuido. Los
cambios efectuados se ven reflejados en las siguientes definiciones de tablas:
4
create table CursosEspeciales(
idcurso int,
idprofe int,
fini varchar,
ffin varchar,
ncuenta int,
cns int,
TotalRecabado numeric(10,2),
CostoCurso numeric(10,2),
foreign key(idprofe) references Profesores,
foreign key(ncuenta, cns) references Cheque,
primary key (idcurso)
);
5
A continuación tenemos los comandos necesarios para la creación del
disparador, en la definición de este se hace referencia a la función definida
antes.
6
-- Insertando datos en PagoCursoEspecial, ¡el alumno paga su curso!
insert into PagoCursoEspecial values( 200, 1, 75 );
7
-- Creación del disparador, cuyo nombre es TgDecrementa Recabado.
Este se dispara
-- después de efectuar el borrado de un registro en la tabla
PagoCursoEspecial, para cada
-- renglón insertado se debe ejecutar la función
DecrementadorTotal().
CREATE TRIGGER TgDecrementaRecabado AFTER DELETE ON
PagoCursoEspecial FOR EACH ROW EXECUTE PROCEDURE
DecrementadorTotal();
Trabajo adicional
Referencias