Ejercicio de Triggers de Base de Datos

Para el Ejemplo de Triggers haremos lo siguiente: CONSIDEREMOS QUE TENEMOS UN PROGRAMA QUE DA MANTENIMIENTO A LA TABLA

Views 134 Downloads 0 File size 37KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Para el Ejemplo de Triggers haremos lo siguiente:

CONSIDEREMOS QUE TENEMOS UN PROGRAMA QUE DA MANTENIMIENTO A LA TABLA “PELICULAS”, SIN EMBARGO, EL PROGRAMA FUE CREADO PARA MANEJAR SOLO LAS COLUMNAS: ID (QUE ES EL IDENTIFICADOR DE LA PELICULA, y NOMBRE (QUE ES EL NOMBRE DE LA PELICULA).

MISTERIOSAMENTE SE HAN CAMBIADO MUCHOS DATOS EN ESTA TABLA, MODIFICACIONES QUE NO ESTABAN APROBADAS. PARA TENER UN MEJOR CONTROL DE LAS MODIFICACIONES, TENEMOS UN REQUERIMIENTO DE AUDITORIA, EN EL SENTIDO DE QUE SE REQUIERE SABER:

1. QUE USUARIO DEL SISTEMA HACE (o ha hecho) MODIFICACIONES A LA TABLA PELICULAS Y EN QUE FECHA Y HORA HA REALIZADO DICHOS CAMBIOS. 2. QUE USUARIO DEL SISTEMA HA CREADO (INGRESADO) NUEVAS PELICULAS EN EL SISTEMA Y EN QUE FECHA Y HORA HA REALIZADO TAL ACCION.

SIN EMBARGO, EL PROGRAMADOR QUE HIZO ESTA APLICACION YA NO TRABAJA PARA NOSOTROS Y NO TENEMOS LOS FUENTES DE LOS PROGRAMAS.

¿COMO PODEMOS IMPLEMENTAR ESTE REQUERIMIENTO?

R./ CON TRIGGERS DE TABLAS.

PASOS:

1.- Crear una tabla.

CREATE TABLE PELICULAS (ID NUMBER(5) primary key,

NOMBRE VARCHAR2(30) not null, USERING VARCHAR2(20), FECING DATE, USERACT VARCHAR2(20), FECACT DATE);

SI NOS FIJAMOS, LA UNICA MODIFICACION QUE HICIMOS FUE AGREGARLE A LA TABLA 4 CAMPOS LOS QUE LLAMAREMOS: CAMPOS DE AUDITORIA.

USERING VARCHAR2(20): inserto/creo).

Este es el usuario que ingreso el registro (que lo

FECING DATE (fecha creacion/insercion).

:

Esta es la fecha/hora de ingreso del registro

USERACT VARCHAR2(20): En esta columna se registra el usuario que haya realizado cualquier modificacion (actualizacion/update) al registro, por ultima vez. FECACT DATE) : En esta columna se registra la fecha/hora de la ultima modificación al registro.

Ahora vamos a diseñar un trigger que lleve el control de estos cambios, ya que no podemos realizar el cambio a nivel de aplicacion: SINTAXIS:

Create or Replace Trigger AUDPELICULAS01 BEFORE insert or update ON PELICULAS for each row Begin if INSERTING then :NEW.usering := user; :NEW.fecing

:= sysdate;

:NEW.useract :NEW.fecact

:= user; := sysdate;

elsif UPDATING then :NEW.useract :NEW.fecact

:= user; := sysdate;

end if; End; /

Explicacion del Trigger: 1.- la sintaxis para creacion del trigger: Create or Replace Trigger NOMBREdelTrigger 2.- Cuando se dispara el evento (antes=before o despues=after) de que ocurra el evento (insert o update). 3.- ¿Como se dispara? Por cada fila de la tabla (for each row) o por condicion (WHEN). Despues viene el cuerpo PL del Trigger. (Begin / End;)

Dentro del Cuerpo podemos ver que estamos capturando 2 eventos: Inserting: Este evento sucede cuando se esta insetando datos en la tabla, y Updating: Este evento lo capturamos cuando se estan modificando datos en la tabla.

De alli tenemos los valores que tiene la tabla y los que va a tener. Los valores que ya estan dentro de la tabla son referenciados como: :OLD.nombredelacolumna, y

Los valores nuevos que se van a insertar/actualizar dentro de la tabla son referenciados como: :NEW.nombredelacolumna.

Por lo tanto, en este caso, mandamos a actualizar los valores nuevos por cada evento, de acuerdo a los requerimientos de auditoria:

:NEW.usering := user; (El valor nuevo de la columna usering sera igual a: la funcion que me devuelve el nombre del usuario).

:NEW.fecing := sysdate; (El valor nuevo de la columna fecing sera igual a: la funcion que me devuelve la fecha del sistema).

Probar el trigger: insert into peliculas(id, nombre) values(1,300);

select * from peliculas; Conectarse con otro usuario, dar permisos de update y correr:

update peliculas set nombre = '12 years a slave' where id = 1;

select * from peliculas;

Tarea: Ahora les queda a ustedes resolver el siguiente problema:

Hasta ahora, auditoria pudo resolver el problema de inserciones y actualizaciones, pero, ¿Que pasa si un usuario borra un registro? Como saber quien fue el que borro el registro, en que fecha y ademas, cual era la informacion que existia en el registro antes de borrarlo?

Todo esto puede ser resuelto con un Trigger de base de datos, recuerden que, no tenemos los fuentes de los programas para resolver.

1.-Diseñar una solucion usando Triggers. 2.-Modificar el trigger existente o Agregar uno nuevo que cumpla con este requerimiento.

Buena Suerte!