Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se crean para conservar la integridad referencial y la coherencia entre los datos entre distintas
tablas; para registrar los cambios que se efectúan sobre las tablas y la identidad de quien los
realizó; para realizar cualquier acción cuando una tabla es modificada; etc.
Si se intenta modificar (agregar, actualizar o eliminar) datos de una tabla asociada a un disparador,
el disparador se ejecuta (se dispara) en forma automática.
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 automáticamente.
no reciben y retornan parámetros.
son apropiados para mantener la integridad de los datos, no para obtener resultados de
consultas.
ON NOMBRETABLA
WHEN CONDICION--OPCIONAL
BEGIN
END NOMBREDISPARADOR;
Los triggers se crean con la instrucción "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 cuando se disparará el trigger en relación al evento, puede ser
BEFORE (antes), AFTER (después) o INSTEAD OF (en lugar de). "BEFORE" significa que el
disparador se activará antes que se ejecute la operación (INSERT, UPDATE O DELETE) sobre
la tabla, que causó el disparo del mismo. "AFTER" significa que el trigger se activará
después que se ejecute la operación que causó el disparo. "INSTEAD of" sólo puede
definirse sobre vistas, anula la sentencia disparadora, se ejecuta en lugar de tal sentencia
(ni antes ni después).
"EVENTO" especifica la operación (acción, tipo de modificación) que causa que el trigger se
dispare (se active), puede ser "INSERT", "UPDATE" o "DELETE"; DEBE colocarse al menos
una acción, puede ser más de una, en tal caso se separan con "OR". Si "UPDATE" lleva una
lista de atributos, el trigger sólo se ejecuta si se actualiza algún 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 operación sobre
la tabla, cuando una sola operación afecta a varios registros. Los triggers a nivel de
sentencia, se activan una sola vez (antes o después de ejecutar la operación 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 cuando un intento de inserción, actualización o borrado
provoca las acciones que el trigger realizará. El bloque se delimita con "BEGIN... END".
Se crean con la instrucción "CREATE TRIGGER" especificando el momento en que se disparará, qué
evento lo desencadenará (inserción, actualización o borrado), sobre qué tabla (o vista) y las
instrucciones que se ejecutarán.
Consideraciones generales:
Los triggers son objetos, así que para obtener información de ellos pueden consultarse los
siguientes diccionarios:
"USER_TRIGGERS": nos 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 descripción,
el cuerpo (trigger_body), etc. En el siguiente ejemplo solicitamos información de todos los
disparadores que comienzan con "TR":
Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción,
actualización o borrado).
La siguiente es la sintaxis para crear un trigger de inserción 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:
MOMENTO INSERT
ON NOMBRETABLA
BEGIN
END NOMBREDISPARADOR;
Analizamos la sintaxis:
Luego de la instrucción "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 cuando se disparará el trigger en relación al evento, puede se BEFORE (antes)
o AFTER (después). Se especifica el evento que causa que el trigger se dispare, en este caso
"INSERT", ya que el trigger se activará cada vez que se ejecute la sentencia "INSERT" sobre la tabla
especificada luego de "ON".
Es un trigger a nivel de sentencia, es decir, se dispara una sola vez por cada sentencia "INSERT",
aunque la sentencia ingrese varios registros. Es el valor por defecto si no se especifica.
Finalmente se coloca el cuerpo del trigger dentro del bloque "BEGIN.. END".
BEFORE INSERT
ON LIBROS
BEGIN
END TR_INGRESAR_LIBROS;
"CREATE OR REPLACE TRIGGER" junto al nombre del disparador que tiene un prefijo "TR" para
reconocer que es un trigger, referencia el evento que lo disparará y la tabla asociada.
Para identificar fácilmente los disparadores de otros objetos se recomienda usar un prefijo y
darles el nombre de la tabla para la cual se crean junto al tipo de acción.
El disparador se activará antes ("BEFORE") del evento "INSERT" sobre la tabla "libros", es decir, se
disparará ANTES que se realice una inserción en "libros". El trigger está definido a nivel de
sentencia, se activa una vez por cada instrucción "INSERT" sobre "libros". El cuerpo del disparador
se delimita con "BEGIN... END", allí se especifican las acciones que se realizarán al ocurrir el evento
de inserción, en este caso, ingresar en la tabla "control" el nombre del usuario que alteró la tabla
"libros" (obtenida mediante la función "user") y la fecha en que lo hizo (mediante la función
"sysdate").
DISPARADOR DE INSERCION A NIVEL DE FILA (INSERT TRIGGER FOR EACH ROW)
En caso que una sola sentencia "INSERT" ingrese varios registros en la tabla asociada, el trigger se
disparará una sola vez; si queremos que se active una vez por cada registro afectado, debemos
indicarlo con "FOR EACH ROW".
La siguiente es la sintaxis para crear un trigger de inserción a nivel de fila, se dispare una vez por
cada fila ingresada sobre la tabla especificada:
MOMENTO INSERT
ON NOMBRETABLA
BEGIN
END NOMBREDISPARADOR;
Creamos un desencadenador que se dispara una vez por cada registro ingresado en la tabla
"ofertas":
BEFORE INSERT
ON OFERTAS
BEGIN
END TR_INGRESAR_OFERTAS;
y se ingresan 5 registros en "ofertas", en la tabla "control" se ingresarán 5 registros, uno por cada
inserción en "ofertas". Si el trigger hubiese sido definido a nivel de sentencia (statement), se
agregaría una sola fila en "control".
DISPARADOR DE BORRADO (NIVEL DE SENTENCIA Y DE FILA)
Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción,
actualización o borrado).
La siguiente es la sintaxis para crear un trigger de eliminación 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:
MOMENTO DELETE
ON NOMBRETABLA
BEGIN
END NOMBREDISPARADOR;
"MOMENTO" indica cuando se disparará el trigger en relación al evento, puede se BEFORE (antes)
o AFTER (después). 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".
Creamos 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 eliminación y la fecha:
CREATE OR REPLACE TRIGGER TR_BORRAR_LIBROS
BEFORE DELETE
ON LIBROS
BEGIN
END TR_BORRAR_LIBROS;
DISPARADOR DE ACTUALIZACION A NIVEL DE SENTENCIA (UPDATE TRIGGER)
Dijimos que un disparador está asociado a una tabla y a una operación específica (inserción,
actualización o borrado).
La siguiente es la sintaxis para crear un trigger de actualización 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:
MOMENTO UPDATE
ON NOMBRETABLA
STATEMENT
BEGIN
END NOMBREDISPARADOR;
Luego de la instrucción "CREATE TRIGGER" se coloca el nombre del disparador. Si agregamos "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 cuando se disparará el trigger en relación al evento, puede ser BEFORE (antes)
o AFTER (después). 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".
BEFORE UPDATE
ON LIBROS
BEGIN
END TR_ACTUALIZAR_LIBROS;
Al ocurrir el evento de actualización sobre "libros", se ingresa en la tabla "control" el nombre del
usuario que alteró la tabla "libros" (obtenida mediante la función "user") y la fecha en que lo hizo
(mediante la función "sysdate").
DISPARADOR DE ACTUALIZACIÓN A NIVEL DE FILA (UPDATE TRIGGER)
En caso que una sola sentencia "UPDATE" modifique varios registros en la tabla asociada, el trigger
se disparará una sola vez; si queremos que se active una vez por cada registro afectado, debemos
indicarlo con "FOR EACH ROW".
La siguiente es la sintaxis para crear un trigger de actualización a nivel de fila, se dispare una vez
por cada fila modificada sobre la tabla especificada:
MOMENTO UPDATE
ON NOMBRETABLA
BEGIN
END NOMBREDISPARADOR;
Creamos un desencadenador a nivel de fila, que se dispara una vez por cada fila afectada por un
"UPDATE" sobre la tabla "libros". Se ingresa en la tabla "control" el nombre del usuario que altera
la tabla "libros" (obtenida mediante la función "USER") y la fecha en que lo hizo (mediante la
función "SYSDATE"):
BEFORE UPDATE
ON LIBROS
BEGIN
END TR_ACTUALIZAR_LIBROS;
El trigger de actualización (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á únicamente
cuando alguno de esos campos (incluidos en la lista) es actualizado. Si se omite la lista de campos,
el trigger se dispara cuando cualquier campo de la tabla asociada es modificado, es decir, por
defecto toma todos los campos de la tabla.
Sintaxis general:
ON TABLA
BEGIN
CUERPODEL DISPARADOR;
END NOMBREDISPARADOR;
"CAMPOS" son los campos de la tabla asociada que activarán el trigger si son modificados. Pueden
incluirse más de uno, en tal caso, se separan con comas.
Creamos un desencadenador a nivel de fila que se dispara cada vez que se actualiza el campo
"precio" de la tabla "libros":
ON LIBROS
BEGIN
END TR_ACTUALIZAR_PRECIO_LIBROS;
Si realizamos un "UPDATE" sobre el campo "precio" de "libros", el trigger se dispara. Pero si
realizamos un "UPDATE" sobre cualquier otro campo, el trigger no se dispara, ya que está definido
solamente para el campo "precio".