TRIGGERS Un trigger es un tipo especial de procedimiento almacenado, que se ejecuta automáticamente como parte de una instrucción de modificación de datos. Están asociados con una tabla específica de la base de datos. Ellos solos se disparan cuando ocurre una inserción, eliminación o una actualización de filas de la tabla a la cual el trigger esta asociado.
Los triggers pueden ser definidos en uno o en más de los siguientes eventos:
- INSERT: invoca al trigger cuando una nueva fila es insertada en la tabla asociada con el trigger.
- DELETE: invoca al trigger cuando una fila asociada a la tabla es borrada.
- UPDATE: invoca al trigger cuando una fila asociada a la tabla es actualizada
- UPDATE OF column-list: invoca al trigger cuando una fila de la tabla asociada es actualizada y cuando la columna de la column-list ha sido modificada.
Uno puede escribir por separado los triggers para cada evento que uno necesite manejar o, si uno tiene acciones compartidas y algunas de esas acciones dependen del evento, uno puede crear un trigger para todos los eventos y usar un IF para distinguir que acción fue tomada.
Los triggers pueden ser ya sea a nivel de fila o a nivel de sentencia:
- A nivel de fila: se ejecuta el trigger una ves por cada ves que una fila es cambiada, insertada o borrada.
En este tipo el trigger se ejecuta BEFORE (antes) o AFTER (después) que la fila es cambiada
- A nivel de sentencia: se ejecuta después de que la entera sentencia es completada.
En este tipo el trigger solo puede ser ejecutado AFTER (después) de ser ejecutada la sentencia.
Si un error ocurre cuando un trigger se esta ejecutando, la operación que disparo el trigger falla, ósea que no se modifica la tabla.
USO DE LOS TRIGGERS Cuándo usar Triggers?
Uno usa triggers cuando la integridad referencial y los constrainst son insuficientes.
Reglas de consistencia (no provistas por el modelo relacional)
Replicación de datos
Auditoria
Acciones en cascada
Autorización de seguridad
Los triggers constituyen la herramienta más potente para el mantenimiento de la integridad de la base de datos, ya que pueden llevar a cabo cualquier acción que sea necesaria para mantener dicha integridad.
Un trigger puede modificar filas de una tabla que un usuario no puede modificar directamente.
Pueden llamar procedimientos y disparar otros triggers, pero no pueden llevar parámetros y no pueden ser invocados por la sentencia CALL.
PRINCIPAL VENTAJA DE USAR TRIGGERS: La principal ventaja es que permiten a los usuarios crear y mantener un conjunto de código más manejable para su empleo por todas las aplicaciones asociadas con las base de datos existentes y futuras.
Limitaciones de los triggers.
Solo se pueden aplicar a una tabla específica, es decir, un trigger no sirve para dos o más tablas.
El trigger se crea en la base de datos que de trabajo pero desde un trigger puedes hacer referencia a otras bases de datos.
Un Trigger devuelve resultados al programa que lo desencadena de la misma forma que un Stored Procedure aunque no es lo más idóneo, para impedir que una instrucción de asignación devuelva un resultado se puede utilizar la sentencia ET NOCOUNT al principio del Trigger.
Las siguientes instrucciones no se pueden utilizar en los triggers:
ALTER DATABASE CREATE DATABASE
DISK INIT DISK RESIZE
DROP DATABASE LOAD DATABASE
LOAD LOG RECONFIGURE
RESTORE DATABASE RESTORE LOG
EJECUCIÓN La ejecución se realiza cuando una tabla a la que esta asociada el trigger genera un evento, ya sea de inserción, eliminación o actualización.
Los triggers están almacenados en una tabla de catálogo del sistema como parte
de la propiedades de la tabla.
Estos son optimizados antes de la ejecución
SI UN TRIGGER FALLA En bases de datos con no logging, no ocurre rollback.
Puede dejar a la base de datos en un estado inconsistente
En bases de datos con logging, ocurre un rollback automático del evento y de la
acción.
BENEFICIOS DE LOS TRIGGERS Estandarización: Estandarizan acciones realizadas por mas de una aplicación del programa. Codificando la acción y guardándola en la base de datos para futuro uso, las aplicaciones solo necesitan disparar el trigger para que logre el resultado repetidamente. Y como los cambios solo ocurren en un lugar, todas las aplicaciones usando esta acción adquieren la nueva funcionalidad si la implementación de la acción cambia.
Eficiencia: triggers utilizados en un ambiente de red de un servidor de base de datos pueden acceder data en la base de datos sin tener que comunicarse con la red. Esto significa que ellos se pueden ejecutar mas rápido y con menos impacto en el desempeño de la red que si los triggers hubieran sido implementados en una aplicación en una de las maquinas de los clientes.
Cuando se crea un trigger es chequeado por correcta sintaxis y es guardado en el sistema de tablas. La primera ves que una aplicación dispara un trigger este es compilado del sistema de tablas a la memoria virtual del servidor y se ejecuta desde ahí (mem. virtual). Si se vuelve a disparar el trigger este se ejecuta instantáneamente ya que una copia del trigger esta en memoria.
Seguridad: proveen seguridad porque permiten a los usuarios acceso limitado a la data en las tablas que ellos no pueden directamente acceder o modificar.
Cuando se ejecuta un trigger, se ejecuta bajo la tabla de permisos del dueño de la tabla asociada y por cualquier usuario que tenga permiso de insertar, actualizar o borrar filas en la tabla puede disparar los triggers. Esto significa que se puede (generalmente se hace) tener diferentes permisos que el ID del usuario que los invoco.
SINTAXIS DE UN TRIGGER CREATE TRIGGER
nombre-trigger tiempo-trigger {lista-eventos-trigger | UPDATE OF column
-list} [ORDER integer] ON table-name
[REFERENCING [OLD AS old-name]
[NEW AS
new-name]]
[FOR EACH {ROW | STATEMENT}]
[WHEN (
search-condition)]
Compound-statement EXPLICACION Trigger-time: BEFORE | AFTER
Trigger-event-list: trigger-event [
trigger-event] Trigger-event: DELETE | INSERT | UPDATE
Los triggers pueden ser disparados por uno o más de los siguientes eventos:
- DELETE: Invoca al trigger cuando una fila es borrada a la tabla asociada.
- INSERT: Invoca al trigger cuando una nueva fila es insertada en la tabla asociada.
- UPDATE: Invoca la trigger cuando una fila es actualizada en la tabla asociada con la base de datos.
- UPDATE OF column-list: Invoca al trigger cuando una fila de la tabla asociada es actualizada y una columna en la lista-columnas es modificada.
Trigger-time A nivel de fila los triggers pueden ser definidos para que se ejecuten BEFORE o AFTER de una inserción, actualización, o borrada.
A nivel de sentencia el trigger solo puede ser ejecutado AFTER (después) de la sentencia se ejecute.
BEFORE UPDATE à los triggers se disparan cada ves que ocurre una actualización en la fila, sin importar si el Nuevo valor sea diferente del antiguo valor.
AFTER UPDATE à los triggers se disparan solo si el nuevo valor es diferente del viejo.
FOR EACH à Para declarar un trigger a nivel-fila, hay se usa la siguiente línea: FOR EACH ROW, para declarar un trigger a nivel-sentencia, se puede usar FOR EACH STATEMENT o se omite la la cláusula FOR EACH. Pero para claridad, es recomendado que se use la cláusula FOR EACH STATEMENT si va a usar un trigger a nivel de sentencia.
La cláusula ORDER à Para los triggers del mismo tipo (insertar, actualizar o borrar) que se disparan al mismo tiempo (antes o después) se puede usar la cláusula order para determinar el orden en que los triggers van a ser disparados. Especificando ORDER 0 es equivalente a omitir la cláusula ORDER.
La cláusula REFERENCING à Las cláusulas REFERENCING OLD y REFERENCING NEW permiten referirnos a la fila ya sea insertada, borrada o actualizada.
Cuando hay INSERT solo se puede tomar la cláusula REFERENCING NEW, que representa la fila insertada. Aquí no hay esta la cláusula REFERENCING OLD.
Cuando hay DELETE solo se toma la cláusula REFENRECING OLD, que representa la fila borrada, aquí no esta la cláusula REFERENCING NEW.
Cuando hay un UPDTE se toma la cláusula REFERENCING OLD, que representa la fila antes de ser actualizada, y se toma la cláusula REFERENCING NEW, que representa la fila después de la actualización.
El significado de REFERENCING OLD y REFERENCING NEW difiere, dependiendo de que si es un trigger de nivel de fila o si es a nivel de sentencia.
Para nivel de fila, la cláusula REFERENCING OLD permite referirse a los valores de la fila ya sea cuando hay una actualización o borrado de la fila. La cláusula REFERENCING NEW permite referirse a los valores de la fila que fue insertada o actualizada. Las OLD (viejas) y NEW (nuevas) filas permiten ser referenciadas en BEFORE y AFTER triggers.
La cláusula REFERENCING NEW permite modificar la nueva fila en un BEFORE trigger antes de que la operación de inserción o actualización tome lugar.
La cláusula WHEN à el trigger se dispara solo para las filas que cumplen la condición. Esta cláusula solo se puede usar en triggers a nivel de fila.
La línea CREATE TRIGGER crea un trigger asociado a la tabla en la base de
datos y guarda el trigger en la base de datos.
En este ejemplo se crea un trigger a nivel de fila. Cuando la cabeza de un departamento es remplazada, se actualiza la columna manager _ id de la tabla empleados de ese departamento.
CREATE TRIGGER tr_manager
BEFORE UPDATE OF dept_head_id
ON department
REFERENCING OLD AS old_dept NEW AS new_dept
FOR EACH ROW
BEGIN
UPDATE employee
SET employee.manager_id = new_dept.dept_head_id
WHERE employee.dept_id = old_dept.dept_id
END
CREACION DE TRIGGERS Se puede crear el trigger manualmente desde el script como se muestra a continuación:
Primero creamos la base de datos.
CREATE TABLE TodaysRecords(
TodaysMaxBarometricPressure FLOAT NOT NULL,
TodaysMinBarometricPressure FLOAT NOT NULL,
PRIMARY KEY (TodaysMaxBarometricPressure, TodaysMinBarometricPressure)
);
CREATE TABLE OurCitysRecords(
RecordMaxBarometricPressure FLOAT NOT NULL,
RecordMinBarometricPressure FLOAT NOT NULL,
PRIMARY KEY (RecordMaxBarometricPressure, RecordMinBarometricPressure)
);
Ya con nuestra base de datos creada, creamos el trigger
CREATE TRIGGER test_delete
BEFORE DELETE ON TodaysRecords
REFERENCING OLD AS OLD_data
FOR EACH ROW
BEGIN
if(OLD_data.TodaysMaxBarometricPressure=(SELECT RecordMaxBarometricPressure FROM
OurCitysRecords))
then
delete
From OurCitysRecords
where OLD_data.TodaysMaxBarometricPressure=(SELECT RecordMaxBarometricPressure FROM
OurCitysRecords)
end if
END;
La 2da línea nos dice que el trigger se va a disparar antes de borrar una fila. Se le puede decir que se dispare después de la eliminación de la fila con solo cambiar la palabra “BEFORE” por “AFTER”
REFERENCING OLD AS OLD_data à esta linea significa que la fila que se va a borrar se va a referenciar con el nombre de OLD_data.
FOR EACH ROW à nos indica que por cada fila que se borre el trigger se va a disparar.
BEGIN
Aquí vamos a poner el código para que cuando el trigger se dispara haga lo que deseamos.
END;
EJECUTANDO UN TRIGGER Los trigger se ejecutan automáticamente cuando ha sucedido una operación de INSERT, UPDATE Y DELETE en la tabla a la cual esta asociada el trigger.
Si se tiene el trigger a nivel fila, este se dispara por cada fila insertada, modificada o borrada. Mientras que si se tiene el trigger a nivel de sentencia, este se ejecuta ya sea antes o después que se haya ejecutado la sentencia.
Cuando se dispara un trigger, el orden de las operaciones es la siguiente:
- BEFORE de que se dispare el trigger.
- las acciones referenciales son realizadas.
- la operación misma es realizada.
- AFTER de que el trigger ha sido disparado.
Si ocurre un error en alguno de estos pasos que no se manejo, la acción que ejecuto el trigger se termina, las acciones que van después no se ejecutan y la operación que disparo el trigger falla.
ALTERANDO LOS TRIGGERS Poniendo la instrucción ALTER TABLE en la definición del trigger nos permite modificar el código que tenemos escrito.
:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />