Sunteți pe pagina 1din 8

FUNDAMENTO TEORICO TRIGGERS Si se intenta modificar (agregar, actualizar o eliminar) datos de una tabla asociada a un disparador, el disparador se ejecuta

(se dispara) en forma automtica. La diferencia con los procedimientos almacenados del sistema es que los triggers: No pueden ser invocados directamente; al intentar modificar los datos de una tabla asociada a un disparador, el disparador se ejecuta

automticamente. No reciben y retornan parmetros. Son apropiados para mantener la integridad de los datos, no para obtener resultados de consultas. create or replace trigger NOMBREDISPARADOR MOMENTO-- before, after o instead of EVENTO-- insert, update o delete of CAMPOS-- solo para update on NOMBRETABLA NIVEL--puede ser a nivel de sentencia (statement) o de fila (for each row) when CONDICION--opcional begin CUERPO DEL DISPARADOR--sentencias end NOMBREDISPARADOR; Los triggers se crean con la instruccin "create trigger" seguido del nombre del disparador. Si se agrega "or replace" al momento de crearlo y ya existe un trigger con el mismo nombre, tal disparador ser borrado y vuelto a crear. "MOMENTO" indica donde se disparar el trigger en relacin al evento, puede ser BEFORE (antes), AFTER (despus) o INSTEAD OF (en lugar de). "before" significa que el disparador se activar antes que se ejecute la operacin (insert, update o delete) sobre la tabla, que caus el disparo del mismo. "After" significa que el trigger se activar despus que se ejecute la operacin que caus el disparo. "Instead of" slo puede definirse sobre vistas, anula la sentencia disparadora, se ejecuta en lugar de tal sentencia (ni antes ni despus).

"EVENTO" especifica la operacin (accin, tipo de modificacin) que causa que el trigger se dispare (se active), puede ser "insert", "update" o "delete". Debe colocarse una accin, puede ser ms de una, en tal caso se separan con "or". Si "update" lleva una lista de atributos, el trigger slo se ejecuta si se actualiza algn atributo de la lista. "on NOMBRETABLA" indica la tabla (o vista) asociada al disparador; "NIVEL" puede ser a nivel de sentencia o de fila. "for each row" indica que el trigger es a nivel de fila, es decir, se activa una vez por cada registro afectado por la operacin sobre la tabla, donde una sola operacin afecta a varios registros. Los triggers a nivel de sentencia, se activan una sola vez (antes o despus de ejecutar la operacin sobre la tabla). Si no se especifica, o se especifica "statement", es a nivel de sentencia. "CUERPO DEL DISPARADOR" son las acciones que se ejecutan al dispararse el trigger, las condiciones que determinan un intento de insercin, actualizacin o borrado provoca las acciones que el trigger realizar. El bloque se delimita con "begin... end". Entonces, un disparador es un bloque de cdigo asociado a una tabla que se dispara automticamente antes o despus de una sentencia "insert", "update" o "delete" sobre la tabla. Se crean con la instruccin "create trigger" se especifica el momento en que se disparar, qu evento lo desencadenar (insercin, actualizacin o borrado), sobre qu tabla (o vista) y las instrucciones que se ejecutarn. Los disparadores pueden clasificarse segn tres parmetros: El momento en que se dispara: si se ejecutan antes (before) o despus (after) de la sentencia. El evento que los dispara: insert, update o delete, segn se ejecute una de estas sentencias sobre la tabla.

Nivel: depende si se ejecuta para cada fila afectada en la sentencia (por cada fila) o bien una nica vez por sentencia independientemente de la filas afectadas (nivel de sentencia). Consideraciones generales: o Las siguientes instrucciones no estn permitidas en un

desencadenador: create database, alter database, drop database, load database, restore database, load log, reconfigure, restore log, disk init, disk resize. o Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificacin (insercin, actualizacin o borrado) para una misma tabla. Por ejemplo, se puede crear un "insert trigger" para una tabla que ya tiene otro "insert trigger". Disparador (informacin) Los triggers son objetos, as que para obtener informacin de ellos pueden consultarse los siguientes diccionarios: "user_objects": muestra todos los objetos de la base de datos seleccionada, incluidos los triggers. En la columna "object_type" aparece "trigger" si es un disparador. En el siguiente ejemplo se solicitan todos los objetos que son disparadores: select *from user_objects where object_type='TRIGGER'; "user_triggers": muestra todos los triggers de la base de datos actual. Muestra el nombre del desencadenador (trigger_name), si es before o after y si es a nivel de sentencia o por fila (trigger_type), el evento que lo desencadena (triggering_event), a qu objeto est asociado, si tabla o vista (base_object_type), el nombre de la tabla al que est asociado (table_name), los campos, si hay referencias, el estado, la descripcin, el cuerpo (trigger_body), etc. En el siguiente

ejemplo se solicita informacin de todos los disparadores que comienzan con "TR": select trigger_name, triggering_event from user_triggers where trigger_name like 'TR%'; "user_source": se puede visualizar el cdigo fuente almacenado en un disparador. En el siguiente ejemplo se solicita el cdigo fuente del objeto "TR_insertar_libros": select *from user_source where name='TR_INSERTAR_LIBROS'; Disparador de insercin a nivel de sentencia Dijimos que un disparador est asociado a una tabla y a una operacin especfica (insercin, actualizacin o borrado). A continuacin se ver la creacin de un disparador para el evento de insercin: "insert triger". La siguiente es la sintaxis para crear un trigger de insercin que se dispare cada vez que se ejecute una sentencia "insert" sobre la tabla especificada, es decir, cada vez que se intenten ingresar datos en la tabla: create or replace trigger NOMBREDISPARADOR MOMENTO insert on NOMBRETABLA begin CUERPO DEL TRIGGER; end NOMBREDISPARADOR; Disparador de insercion a nivel de fila (insert trigger for each row) Vimos la creacin de un disparador para el evento de insercin a nivel de sentencia, es decir, se dispara una vez por cada sentencia "insert" sobre la tabla asociada.

En caso que una sola sentencia "insert" ingrese varios registros en la tabla asociada, el trigger se disparar una sola vez, si se quire que se active una vez por cada registro afectado, se debe indicar con "for each row". La siguiente es la sintaxis para crear un trigger de insercin a nivel de fila, se dispare una vez por cada fila ingresada sobre la tabla especificada. create or replace trigger NOMBREDISPARADOR MOMENTO insert on NOMBRETABLA for each row begin CUERPO DEL TRIGGER; end NOMBREDISPARADOR; Disparador de borrado (nivel de sentencia y de fila) Dijimos que un disparador est asociado a una tabla y a una operacin especfica (insercin, actualizacin o borrado). La siguiente es la sintaxis para crear un trigger de eliminacin que se dispare cada vez que se ejecute una sentencia "delete" sobre la tabla especificada, es decir, cada vez que se eliminen registros de la tabla. create or replace trigger NOMBREDISPARADOR MOMENTO delete on NOMBRETABLA NIVEL-- statement o for each row begin CUERPO DEL TRIGGER; end NOMBREDISPARADOR; Luego de la instruccin "create trigger" o "create or replace trigger" se coloca el nombre del disparador. "MOMENTO" indica donde se disparar el trigger en relacin al evento, puede ser BEFORE (antes) o AFTER (despus). Se especifica el evento que causa que el trigger se dispare, en este caso "delete", ya que el trigger se activar

cada vez que se ejecute la sentencia "delete" sobre la tabla especificada luego de "on". En "NIVEL" se especifica si ser un trigger a nivel de sentencia (se dispara una sola vez por cada sentencia "delete", aunque la sentencia elimine varios registros) o a nivel de fila (se dispara tantas veces como filas se eliminan en la sentencia "delete"). Finalmente se coloca el cuerpo del tigger dentro del bloque "begin end". Se crea un desencadenador a nivel de fila que se dispara cada vez que se ejecuta un "delete" sobre la tabla "libros", en el cuerpo del trigger se especifican las acciones, en este caso, por cada fila eliminada de la tabla "libros", se ingresa un registro en "control" con el nombre del usuario que realiz la eliminacin y la fecha. Disparador de actualizacin - lista de campos (update trigger) El trigger de actualizacin (a nivel de sentencia o de fila) permite incluir una lista de campos. Si se incluye el nombre de un campo (o varios) luego de "update", el trigger se disparar donde alguno de esos campos (incluidos en la lista) sea actualizado. Si se omite la lista de campos, el trigger se dispara al momento en que cualquier campo de la tabla asociada sea modificado, es decir, por defecto toma todos los campos de la tabla. La lista de campos solamente puede especificarse en disparadores de actualizacin, nunca en disparadores de insercin o borrado. create or replace trigger NOMBREDISPARADOR MOMENTO update of CAMPOS on TABLA NIVEL--statement o for each row begin CUERPODEL DISPARADOR; end NOMBREDISPARADOR;

"CAMPOS" son los campos de la tabla asociada que activarn el trigger si son modificados. Pueden incluirse ms de uno, en tal caso, se separan con comas. Disparador de actualizacion a nivel de sentencia (update trigger) Dijimos que un disparador est asociado a una tabla y a una operacin especfica (insercin, actualizacin o borrado). La siguiente es la sintaxis para crear un trigger de actualizacin a nivel de sentencia, que se dispare cada vez que se ejecute una sentencia "update" sobre la tabla especificada, es decir, cada vez que se intenten modificar datos en la tabla: create or replace trigger NOMBREDISPARADOR MOMENTO update on NOMBRETABLA statement begin CUERPO DEL TRIGGER; end NOMBREDISPARADOR; Luego de la instruccin "create trigger" se coloca el nombre del disparador. Si se agrega "or replace" al momento de crearlo y ya existe un trigger con el mismo nombre, tal disparador ser borrado y vuelto a crear. "MOMENTO" indica si se disparar el trigger en relacin al evento, puede ser BEFORE (antes) o AFTER (despus). Se especifica el evento que causa que el trigger se dispare, en este caso "update", ya que el trigger se activar cada vez que se ejecute la sentencia "update" sobre la tabla especificada luego de "on" "statement" significa que es un trigger a nivel de sentencia, es decir, se dispara una sola vez por cada sentencia "update", aunque la sentencia modifique varios registros; como en cualquier trigger, es el valor por defecto si no se especifica. Finalmente se coloca el cuerpo del tigger dentro del bloque "begin.. end".

Disparador de mltiples eventos Un trigger puede definirse sobre ms de un evento; en tal caso se separan con "or". create or replace trigger NOMBREDISPARADOR MOMENTO-- before, after o instead of of CAMPO--si alguno de los eventos es update EVENTOS-- insert, update y/o delete on NOMBRETABLA NIVEL--puede ser a nivel de sentencia (statement) o de fila (for each row) begin CUERPO DEL DISPARADOR--sentencias end NOMBREDISPARADOR;

Si el trigger se define para ms de un evento desencadenante, en el cuerpo del mismo se puede emplear un condicional para controlar cul operacin dispar el trigger. Esto permite ejecutar bloques de cdigo segn la clase de accin que dispar el desencadenador. Para identificar el tipo de operacin que dispar el trigger se emplea "inserting", "updating" y "deleting". Disparador (eliminar) Si se elimina una tabla, se eliminan todos los triggers establecidos sobre ella. Para eliminar un trigger se emplea la siguiente sentencia: drop trigger NOMBRETRIGGER;

S-ar putea să vă placă și