Documentos de Académico
Documentos de Profesional
Documentos de Cultura
automáticamente cuando ocurre algún evento (como inserción, actualización o borrado) sobre
una determinada tabla (o vista); es decir, cuando se intenta modificar los datos de una tabla (o
vista) asociada al disparador.
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.
- 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.
"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.
- el evento que los dispara: insert, update o delete, según se ejecute una de estas sentencias sobre
la tabla.
- nivel: dependiendo 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:
- Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificación
(inserción, actualización o borrado) para una misma tabla. Por ejemplo, se puede crear un "insert
trigger" para una tabla que ya tiene otro "insert trigger".
A continuación veremos la creación de disparadores para los distintos sucesos (inserción, borrado,
actualización) y todas las cláusulas adicionales.
Los triggers son objetos, así que para obtener información de ellos pueden consultarse los
siguientes diccionarios:
- "user_objects": nos 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
solicitamos todos los objetos que son disparadores:
- "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":
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".
Ejemplo: Creamos un desencadenador que se dispara cada vez que se ejecuta un "insert" sobre la
tabla "libros":
before insert
on libros
begin
"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").
Problema:
Una librería almacena los datos de sus libros en una tabla denominada "libros" y controla las
acciones que los empleados realizan sobre dicha tabla almacenando en la tabla "control" el
nombre del usuario y la fecha, cada vez que se ingresa un registro en la tabla "libros".
Eliminamos la tabla:
codigo number(6),
titulo varchar2(40),
autor varchar2(30),
precio number(6,2)
);
usuario varchar2(30),
fecha date );
Creamos un disparador que se dispare cada vez que se ingrese un registro en "libros"; el trigger
debe ingresar en la tabla "control", el nombre del usuario, la fecha y la hora en la cual se realizó un
"insert" sobre "libros":
before insert
on libros
begin
end tr_ingresar_libros;
Veamos qué nos informa el diccionario "user_triggers" respecto del trigger anteriormente creado:
- base_object_type: a qué objeto está asociado, puede ser una tabla o una vista, en este caso, una
tabla (table);
Verificamos que el trigger se disparó consultando la tabla "control" para ver si tiene un nuevo
registro:
Una librería almacena los datos de sus libros en una tabla denominada "libros" y en una tabla
"ofertas", algunos datos de los libros cuyo precio no supera los $30. Además, controla las
inserciones que los empleados realizan sobre "ofertas", almacenando en la tabla "control" el
nombre del usuario, la fecha y hora, cada vez que se ingresa un nuevo registro en la tabla
"ofertas".
codigo number(6),
titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(6,2)
);
titulo varchar2(40),
autor varchar2(30),
precio number(6,2)
);
usuario varchar2(30),
fecha date
);
4- Cree un disparador que se dispare cuando se ingrese un nuevo registro en "ofertas"; el trigger
debe ingresar en la tabla "control", el nombre del usuario, la fecha y la hora en la cual se realizó un
"insert" sobre "ofertas"
5- Vea qué informa el diccionario "user_triggers" respecto del trigger anteriormente creado
7- Ingrese en "ofertas" los libros de "libros" cuyo precio no superen los $30, utilizando la siguiente
sentencia:
codigo number(6),
titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(6,2)
);
titulo varchar2(40),
autor varchar2(30),
precio number(6,2)
);
usuario varchar2(30),
fecha date
);
before insert
on ofertas
begin
end tr_ingresar_ofertas;