Sei sulla pagina 1di 6

Departamento de Electrnica e Informtica

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

Departamento de Electrnica e Informtica


Lcda. Lissbeth Rodrguez cdigo principal del trigger. Antes se evala la condicin_disparo incluida en la clusula WHEN, si es que est presente. El cuerpo del trigger se ejecuta slo cuando dicha condicin se evala como verdadera. 5. Componentes de un trigger Los componentes de un trigger son el nombre, el suceso de disparo y el cuerpo. La clusula WHEN es opcional. 5.1 Nombres de triggers El espacio de nombres para los triggers es diferente del de otros subprogramas. El espacio de nombres es el conjunto de identificadores vlidos que pueden emplearse como nombres de un objeto. Los triggers existen en un espacio de nombres separado del de los procedimientos, paquetes y tablas, por lo que un trigger puede tener el mismo nombre que una tabla o procedimiento. Sin embargo dentro de un mismo esquema deben tener nombres diferentes entre s. 5.2 Tipos de triggers El suceso de disparo determina el tipo de trigger. Los triggers pueden definirse para las operaciones INSERT, UPDATE o DELETE, y pueden dispararse antes o despus de la operacin. Finalmente, el nivel de los triggers puede ser la fila o la orden. La Figura 1 muestra los tipos de triggers: Categora Valores Comentarios Orden INSERT, Define qu tipo de orden DML provoca la DELETE, activacin del trigger. UPDATE Temporizacin BEFORE o Define si el trigger se activa antes o despus de AFTER que se ejecute la orden (trigger previo o posterior). Nivel Fila u orden Los triggers con nivel de fila se activan una vez por cada fila afectada por la orden que provoc el disparo. Los triggers con nivel de orden se activan slo una vez, antes o despus de la orden. Los triggers con nivel de fila se identifican por la clusula FOR EACH ROW en la definicin del trigger. Figura 1. Tipos de trigger 5.3 Triggers de sustitucin Oracle proporciona un tipo adicional de trigger. Los triggers de sustitucin (INSTEAD OF). Pero tienen una serie de restricciones: INSTEAD OF es una clusula vlida solo para vistas; no se puede especificar un trigger INSTEAD OF en una tabla. Si una vista tiene un trigger INSTEAD OF, cualquier vista creada sobre sta debe tener a su vez un trigger INSTEAD OF. 2

Departamento de Electrnica e Informtica


Lcda. Lissbeth Rodrguez Cuando definimos triggers INSTEAD OF para columnas LOB, podemos leer tanto el seudo-registro :OLD como el seudo-registro :NEW, pero no se puede modificar sus valores. 5.4 Restricciones de los triggers El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es legal en el cuerpo de un trigger, con las siguientes restricciones: 1. Un trigger no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o SAVEPOINT. El trigger se activa como parte de la ejecucin de la orden que provoc el disparo, y forma parte de la misma transaccin que dicha orden. Cuando la orden que provoca el disparo es confirmada o cancelada, se confirma o cancela tambin el trabajo realizado por el trigger. 2. Por razones idnticas, ningn procedimiento o funcin llamado por el trigger puede emitir rdenes de control de transacciones. 3. El cuerpo del trigger no puede contener ninguna declaracin de variables LONG o LONG RAW. 4. Existen restricciones acerca de a qu tablas puede acceder el cuerpo de un trigger. Dependiendo del tipo de trigger y de las restricciones que afecten a las tablas. 6. Eliminacin y deshabilitacin de los triggers La sintaxis de la orden que elimina un trigger es: DROP TRIGGER nombre_trigger; Donde nombre_trigger es el nombre del trigger que se desea eliminar. Esta orden elimina el trigger de forma permanente del diccionario de datos. La sintaxis de la orden que deshabilita un trigger es ALTER TRIGGER nombre_trigger [DISABLE | ENABLE] Donde nombre_trigger es el nombre del trigger. Todos los triggers estn habilitados en el momento de su creacin. Cuando se deshabilita un trigger continua existiendo en el diccionario de datos. Tambin se puede habilitar o deshabilitar todos los triggers de una tabla determinada, utilizando la orden ALTER TABLE con la clusula ENABLE ALL TRIGGERS o DISABLE ALL TRIGGERS. 7. Orden de activacin de los triggers Los triggers se activan al ejecutarse la orden DML. El algoritmo de ejecucin de una orden DML es el siguiente: 1. Ejecutar, si existe, el trigger de tipo BEFORE (trigger previo) con nivel de orden. 2. Para cada fila a la que afecte la orden: a. Ejecutar, si existe, el trigger de tipo BEFORE con nivel de fila. b. Ejecutar la propia orden. 3

Departamento de Electrnica e Informtica


Lcda. Lissbeth Rodrguez c. Ejecutar, si existe, el trigger de tipo AFTER (trigger posterior) con nivel de fila. 3. Ejecutar, si existe, el trigger de tipo AFTER con nivel de orden. 8. Utilizacin de :old y :new en los triggers con nivel de fila Un trigger con nivel de fila se ejecuta una vez por cada fila procesada por la orden que provoca el disparo. Dentro del trigger puede accederse a la fila que est siendo actualmente procesada utilizando, para ello, dos seudo-registros, :old y :new. La Figura 2 muestra este concepto: Orden de disparo :old INSERT No definido; todos los campos toman valor NULL. UPDATE Valores originales de la fila, antes de la actualizacin. DELETE

: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

Departamento de Electrnica e Informtica


Lcda. Lissbeth Rodrguez qu operacin se trata. Estos predicados son INSERTING, UPDATING y DELETING. Su comportamiento es el siguiente: La Figura 3 muestra el comportamiento de INSERTING, UPDATING y DELETING Predicado INSERTING UPDATING DELETING Comportamiento TRUE si la orden de disparo es INSERT; FALSE en otro caso. TRUE si la orden de disparo es UPDATE; FALSE en otro caso. TRUE si la orden de disparo es DELETE; FALSE en otro caso. Figura 3. INSERTING, UPDATING y DELETING

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

Departamento de Electrnica e Informtica


Lcda. Lissbeth Rodrguez DECLARE typ CHAR(8); hour NUMBER; BEGIN IF updating THEN typ := 'update'; END IF; IF deleting THEN typ := 'delete'; END IF; IF inserting THEN typ := 'insert'; END IF; hour := TRUNC((SYSDATE - TRUNC(SYSDATE)) * 24); UPDATE stat_tab SET rowcnt = rowcnt + stat.rowcnt WHERE utype = typ AND uhour = hour; IF SQL%ROWCOUNT = 0 THEN INSERT INTO stat_tab VALUES (typ, stat.rowcnt, hour); END IF; EXCEPTION WHEN dup_val_on_index THEN UPDATE stat_tab SET rowcnt = rowcnt + stat.rowcnt WHERE utype = typ AND uhour = hour; END; 12. Conclusiones Las restricciones de integridad complejas que refieren a varias tablas y atributos no pueden ser especificadas en las definiciones de tablas. En cambio, los triggers proveen una tcnica procedural para especificar y mantener restricciones de integridad. Permiten especificar restricciones ms complejas ya que un trigger es esencialmente un procedimiento PL/SQL. Ahora bien, si es posible, deben usarse restricciones para la comprobacin; son ms rpidas que usar triggers de base de datos. Gracias a la posibilidad de tener mltiples triggers del mismo tipo para el mismo comando sobre cualquier tabla se permite la instalacin modular de aplicaciones que tienen triggers sobre las mismas tablas. En un trigger no se debe incluir mucho cdigo sino que resulta ms eficiente poner los segmentos de cdigo ms largos dentro de un procedimiento y, despus, llamar al procedimiento desde el trigger de la base de datos (los procedimientos son almacenados en una forma compilada). Los triggers son administrados de manera centralizada. Se codifican una sola vez, se prueban y se fuerza a que todas las aplicaciones pasen por su control. Los triggers deben ser controlados, o al menos auditados, por un administrador de BDs. 6

Potrebbero piacerti anche