Manual del estudiante de Ingeniería en Sistemas de UTN/Bases de datos avanzadas/Triggers
Los triggers son procesos que son ejecutados implícitamente cuando una sentencia INSERT, UPDATE o DELETE es ejecutada sobre la tabla asociada con el trigger.
Un trigger puede incluir sentencias SQL y PL/SQL para ejecutar como una unidad y puede llamar a procedimientos almacenados.
Los triggers se emplean en general para:
- Generar automáticamente columnas derivadas.
- Prevenir transacciones inválidas.
- Forzar autorizaciones de seguridad complejas.
- Forzar relaciones de integridad referencial a lo largo de los nodos de una base de datos distribuida.
- Forzar reglas de negocios complejas.
- Proveer eventos de logging transparentes.
- Mantener el sincronismo sobre tablas replicadas.
- Proveer auditorías sofisticadas.
- Hacer estadísticas sobre el acceso de los datos.
Cuando se dispara un trigger una sentencia SQL dentro del trigger puede potencialmente disparar otros triggers.
¿Triggers o restricciones de integridad? =
[editar]Oracle recomienda usar triggers de Bases de Datos para restringir la entrada de datos, solo en los siguientes casos:
- Cuando una regla de integridad referencial no puede ser forzada usando alguna de las siguientes restricciones de integridad: NOT NULL, UNIQUE key, PRIMARY key, FOREIGN key, CHECK, update CASCADE, update and delete SET NULL, update and delete SET DEFAULT.
- Para forzar integridad referencial cuando las tablas padres e hijo están en nodos diferentes de una base de datos distribuida.
- Para forzar reglas de negocio complejas que no pueden definirse usando restricciones de integridad.
Partes de un trigger
[editar]Un trigger está formado por:
- Un evento o sentencia disparador.
- Una restricción del trigger.
- Una acción del trigger.
- El evento o sentencia de disparo
- Es la sentencia SQL que causa que el
trigger sea disparado. Estas sentencias pueden ser INSERT, UPDATE o DELETE.
Ejemplos:
...UPDATE OF partes ON inventarios ...
Significa que se dispare el trigger cuando la columna partes de una fila de la tabla inventarios se actualice.
Solo en los UPDATE se pueden especificar columnas para el disparo de un trigger.
Se pueden especificar sentencias SQL múltiples:
... INSERT OR UPDATE OR DELETE OF inventarios ...
Significa que cualquiera de las tres acciones que se hagan sobre la tabla inventarios dispara el trigger.
En estos casos se pueden especificar condicionales para detectar la sentencias que se ejecutan ante cada una de las acciones que disparan el trigger.
- La restricción del trigger
Especifica una expresión lógica que se debe evaluar a verdadero para que se dispare el trigger. No se ejecutará si la expresión evalúa a falso o desconocido.
- La acción del trigger
Es el procedimiento PL/SQL que se ejecuta cuando la sentencia trigger se ejecuta y la restricción del trigger es verdadera. Para triggers de filas las sentencias de una acción del trigger, pueden acceder a los valores de las columnas (nuevo y viejo) de la fila actual que esta siendo procesada por el trigger. Los nombres NEW y OLD proveen el acceso a los valores nuevos y viejos para cada columna.
Tipos de Triggers
[editar]Trigger de filas y de sentencia
[editar]Cuando se define un trigger se puede especificar el número de veces que se va a ejecutar la acción:
- Una vez por cada fila afectada por las sentencia de disparo.
- Una vez por cada sentencia de disparo; esto puede ser útil si el código de la acción del trigger no depende de los datos provistos por el trigger o las filas afectadas.
Triggers BEFORE y AFTER
[editar]En este caso se determina el momento en que se ejecuta la acción trigger, si antes o después de la sentencia de disparo.
BEFORE
[editar]Este tipo de trigger se debe ejecutar cuando:
- Cuando la acción del trigger debe determinar si le permite finalizar a la sentencia de disparo.
- Si se deben verificar valores específicos de columnas antes de completar una sentencia de disparo INSERT o UPDATE.
AFTER
[editar]Se debe emplear este tipo de trigger cuando:
- Cuando se quiere completar la sentencia de disparo antes de ejecutar la acción del trigger.
- Si ya existe un trigger BEFORE un AFTER puede realizar diferentes acciones con la misma sentencia de disparo.
Combinaciones
[editar]La acción del trigger. siempre que no se viole la restricción del trigger, se ejecuta dependiendo de la combinación de tipos de trigger:
BEFORE statement: antes de ejecutar la sentencia de disparo.
BEFORE row: antes de modificar cada fila afectada por la sentencia de disparo, y antes de chequear las restricciones de integridad apropiadas.
AFTER statement: después de ejecutar la sentencia de disparo, y después de chequear las restricciones de integridad apropiadas.
AFTER row: después de modificar cada fila afectada por la sentencia de disparo y posiblemente aplicando las restricciones de integridad apropiadas. A diferencia de los trigger de filas BEFORE, los AFTER BLOQUEAN las filas.
Se pueden tener múltiples triggers del mismo tipo para la misma sentencia para la tabla que sea.
Triggers INSTEAD OF
[editar]Estos triggers brindan una manera transparente de modificar vistas que no pueden ser modificadas directamente por medio de sentencias DML.
Se llaman INSTEAD OF porque a diferencia de otros tipos de triggers Oracle dispara el trigger en lugar de ejecutar la sentencia de disparo.
El usuario escribe operaciones normales de INSERT, UPDATE o DELETE sobre la vista y el trigger INSTEAD OF realiza las operaciones correctas sobre las tablas bases.
Ejecución de los Triggers
[editar]Los triggers puede estar habilitados(enabled) o inhabilitados (disabled). Si están habilitados, Oracle automáticamente:
- Ejecuta todos lo triggers en una secuencia de disparo planeada cuando más de un trigger es disparado por una simple secuencia SQL.
- Realiza restricciones de integridad en un momento determinado, con respecto a los diferentes tipos de triggers y garantiza que los triggers no puedan comprometer las restricciones de integridad.
- Realiza la dependencia entre triggers y objetos referenciados en el
código de la acción del trigger.
- Usa el two–phase commit si un trigger actualiza tablas remotas en una base de datos distribuida.
- Dispara múltiple triggers en un orden no-especificado, si más de un trigger de un mismo tipo existe para una sentencia determinada.
La sentencia de disparo o las sentencias dentro de un trigger puede causar el chequeo de una o más restricciones de integridad. También pueden contener sentencias que causan que otros triggers se disparen. Oracle utiliza el siguiente modelo para resolver apropiadamente la secuencia de triggers y restricciones:
- Ejecuta todos los triggers de sentencia BEFORE que aplican a las sentencias.
- Itera por cada fila afectada por la sentencia SQL:
- Ejecuta todas los triggers de filas BEFORE que aplican a las sentencias.
- Bloquea, cambia filas y realiza chequeos de integridad (el bloqueo no se libera hasta que la transacción no este cometida).
- Ejecuta los triggers de fila AFTER que aplican a las sentencia de disparo.
- Completa los chequeos de integridad diferidos.
- Ejecuta todas los triggers de sentencia AFTER que se aplican a la sentencia.
El modelo de ejecución presentado es recursivo: si dentro del trigger se ejecutan sentencias INSERT, DELETE o UPDATE que vuelven a su vez a disparar triggers este proceso se realiza recursivamente.
Si se presenta una excepción dentro del trigger y ésta no es explícitamente manejada, todas las acciones disparadas son “rolledback”.
Los triggers del mismo tipo para la misma sentencia no se garantizan que se disparen en un orden específico.