Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lcda. Lissbeth Rodrguez Resumen Este artculo tiene como objetivo intentar mostrar un breve panorama de cmo crear TRIGGERS para bases de datos bajo Oracle, as como describir la funcionalidad tan verstil que proporcionan al programador. Por lo tanto es de esperar que se tenga un poco de experiencia con entornos Oracle y conozca la notacin bsica de bases de datos, de igual manera sern necesarios unos mnimos conocimientos del lenguaje PL/SQL. 1. Introduccin Todas las implementaciones que hemos investigado soportan triggers de insercin, actualizacin y borrado; algunos se disparan por operacin, otros saltan por tupla. Ninguno de los DBMS relacionales, excepto el Progress Database Server, soportan triggers en operaciones de SELECT. Hay un par de razones para pensar que esto sera til: implementar un control de seguridad propio y llevar estadstica de acceso a las tablas de almacenamiento. Quiz Oracle se ponga las pilas en su prxima versin. De momento, la funcionalidad que nos proporcionan los triggers hacen imprescindible su conocimiento por los desarrolladores de aplicaciones sobre BDs. 2. Definicin de trigger Los triggers son procedimientos que se ejecutan cuando se produce un suceso de base de datos (una operacin DML: INSERT, UPDATE o DELETE) en una tabla especfica. El acto de ejecutar un trigger se conoce como disparo. Antes de crear un trigger primero debemos crear un usuario diferente a SYS y logearnos (crear un nuevo esquema) con ese usuario y otorgarle los permisos y privilegios para poder crearlos . YA QUE NO SE PUEDEN CREAR TRIGGERS SOBRE EL USUARIO SYS. 3. Uso de los triggers Los triggers pueden emplearse para muchas cosas diferentes, incluyendo: El mantenimiento de restricciones de integridad complejas, que no sean posibles con las restricciones declarativas definidas en el momento de crear la tabla. La auditora de la informacin contenida en una tabla, registrando los cambios realizados y la identidad del que los llev a cabo. El aviso automtico a otros programas de que hay que llevar a cabo una determinada accin, cuando se realiza un cambio en una tabla.
4. Sintaxis general de trigger La sintaxis general para crear un trigger es: CREATE [OR REPLACE] TRIGGER nombre_trigger { BEFORE | AFTER suceso_disparo ON referencia_tabla [FOR EACH ROW [ WHEN condicin_disparo ]] cuerpo_trigger, Donde nombre_trigger es el nombre del trigger, suceso_disparo especifica cundo se activa el trigger, referencia_tabla es la tabla para la cual se define el trigger y cuerpo_trigger es el 1
:new Valores que sern insertados cuando se complete la orden. Nuevos valores que sern escritos cuando se complete la orden.
Valores, antes del borrado de No definidos; todos los campos la fila. toman el valor NULL. Figura 2. :old y :new
El tipo de estos seudo-registros es: tabla_disparo%ROWTYPE; Donde tabla_disparo es la tabla sobre la que se ha definido el trigger. Los registros :new y :old son slo vlidos dentro de los triggers con nivel de fila. Si se intenta Hacer referencia a cualquiera de los dos dentro de un trigger con nivel de orden, se obtendr un error de compilacin. Puesto que un trigger con nivel de orden se ejecuta una sola vez, incluso si la orden procesa varias filas, entonces :old y :new no tienen ningn sentido ya que no se sabe a qu fila se estn refiriendo. 9. La clusula WHEN La clusula WHEN slo es vlida para los triggers con nivel de fila. Si est presente, el cuerpo del trigger slo se ejecutar para las filas que cumplan la condicin especificada en la clusula. La clusula WHEN tiene la forma: WHEN condicin Donde condicin es una expresin booleana que ser evaluada para cada fila. Se puede hacer tambin referencia a los registros :new y :old dentro de la condicin, pero en ese caso no se utilizan los dos puntos. 10. Utilizacin de predicados de los triggers: INSERTING, UPDATING y DELETING Dentro de un trigger en el que se disparan distintos tipos de rdenes DML (INSERT, UPDATE y DELETE), hay tres funciones booleanas que pueden emplearse para determinar de 4
11. Ejemplo Un ejemplo de su uso es proporcionar una facilidad de auditora donde se realiza automticamente un registro de actividades siempre que se cambia una fila de una tabla. Sin los triggers de bases de datos esta funcin sera implementada en los programas de seccin de entrada (front-end) que realizan el cambio en la base de datos; sin embargo alguien que se pase por alto el cdigo de los programas de seccin de entrada (utilizando SQL*Plus, por ejemplo) no pasara por las comprobaciones y el procesamiento definidos. Supngase que tenemos una tabla llamada SAL (en la que almacenamos los salarios de los empleados de la empresa) y resulta necesario conocer cundo est siendo accedida la tabla y el tipo de operacin que se realiza. El ejemplo que presentamos a continuacin contiene un paquete de muestra que rastrea esta informacin registrando la hora y la accin ejecutada (UPDATE, DELETE, o INSERT) en la tabla SAL. Mediante una variable global, STAT.ROWCNT, inicializada a cero por el trigger BEFORE e incrementada cada vez que un trigger con nivel de fila es ejecutado, tenemos la informacin estadstica que necesitamos salvar en el trigger AFTER. DROP TABLE stat_tab; CREATE TABLE stat_tab(utype CHAR(8), rowcnt INTEGER, uhour INTEGER); CREATE OR REPLACE PACKAGE stat IS rowcnt INTEGER; END; CREATE TRIGGER bt BEFORE UPDATE OR DELETE OR INSERT ON sal BEGIN stat.rowcnt := 0; END; CREATE TRIGGER rt BEFORE UPDATE OR DELETE OR INSERT ON sal FOR EACH ROW BEGIN stat.rowcnt := stat.rowcnt + 1; END; CREATE TRIGGER at AFTER UPDATE OR DELETE OR INSERT ON sal 5