Publicado el 23 de Junio del 2021
892 visualizaciones desde el 23 de Junio del 2021
100,7 KB
9 paginas
Creado hace 18a (30/10/2006)
Disparadores - Trigger
1
Disparadores (triggers - T)
Disparadores (triggers)
• Definición
• Elementos de un T
• Tipo de T según cuando se dispare
• Estado de una T
• Acoplamiento o Consideración de T
• Combinación de T
• Algoritmos y modelos de Ejecución
• Uso de las T
Originales de Sybase SQL Server.
– No forman parte de SQL2 (SQL92)
– Pero sí de SQL3
Procedimientos que ejecuta de manera implícita el
SGBD como respuesta a un evento
– Base fundamental de las Bases de Datos Activas
Por ejemplo:
– Cuando hay menos de X productos en stock, hacer un nuevo pedido
– Si el producto caduca hoy avisar almacén para que lo retiren
– Cuando sean las 17:00h hacer copia de seguridad de la BD
Elementos de un disparador
Disparadores son ECA: Evento + Condición + Acción
Evento:
– Suceso que causa que se dispare un trigger
• INSERT, UPDATE, DELETE
• Oracle (además: CREATE, ALTER, DROP, LOGON, LOGOFF,
STARTUP, SHUTDOWN, SERVERERROR)
Condición:
– Expresión booleana que debe ser TRUE para que se dispare el
trigger realmente. La acción no se ejecuta si la expresión se
evalúa a FALSE o Unknown.
Acción:
– Procedimiento que se debe ejecutar cuando se dispare el trigger.
• Oracle: PL/SQL, Java, Llamada a procedimiento en C
• SQL Server: Transact-SQL
• No admiten instrucciones de control de transacciones
Sintaxis: Disparadores en SQL3
CREATE TRIGGER <identificador>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
[FOR EACH ROW | STATEMENT?
[REFERENCING OLD AS <nombre> NEW AS <nombre>?
[REFERENCING OLD_TABLE AS <nom> NEW_TABLE AS <nom> ?
[WHEN <condición> ?
<bloque de acciones sobre la base de datos> o
<llamada a un procedimiento almacenado> o
<llamada a una función externa>
DROP TRIGGER <identificador>
REPLACE TRIGGER <identificador> <lo mismo que create>
Disparadores. Primer ejemplo
Disparadores. Primer ejemplo
Evento:
– Se modifican las existencias de la tabla productos (a menos)
Condición:
– Hay menos unidades que el mínimo (x)
Acción:
– Hacer un nuevo pedido de aquellos productos que tienen menos
unidades que X.
CREATE TRIGGER NuevoPedido
AFTER UPDATE OF unidades ON Producto
WHEN NEW.unidades < X
FOR EACH ROW
E
C
CREATE TRIGGER: Nombre del T o regla activa. Ej CREATE TRIGGER NuevoPedido
AFTER: Regla que se activará despues de que tenga lugar el evento (E)
ON: Tabla o relación asociada al E. Por ej, ON Producto
UPDATE OF: Atributos actualizables para los E Upadate. Por ej, UPDATE OF unidades
WHEN: Condición (C) a verificar después de activarse el T. Por ej, WHEN New.unidades < X
FOR EACH ROW: Se activara una vez para cada una tuplaque afecte al T.
BEGIN ... END: La Acción (A) a emprender. Por ej, BEGIN INSERT INTO ... END
NEW y OLD: Permite referenciar a la tupla insertada y eliminada por el T. Por ej, Old.código
EJ.
CREATE TRIGGER NuevoPedido
AFTER UPDATE OF unidades ON Producto
WHEN New.unidades<X
FOR EACH ROW
BEGIN INSERT INTO PEDIDO VALUES (Old.código, X, today()) ... END
BEGIN
INSERT INTO PEDIDO
VALUES (:OLD.código, X, today ())
...
END
CrearNuevoPedido
A
DBD 2006-2007
Disparadores - Trigger
2
Disparadores: Tipos
CREATE TRIGGER <nombre del T.>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
Según cuando se ejecutan la acción:
– BEFORE trigger
• Se ejecuta la acción antes de que se realice la operación que desencadena
el evento
– Antes de insertar, borrar, modificar...
– AFTER trigger
• Se ejecuta después de que se realice la operación que desencaden a el
evento
– Después de insertar, borrar, modificar...
– INSTEAD OF trigger
• Se ejecuta en lugar de la operación que desencadena el evento
– En lugar de insertar, borrar, modificar
Comparación BEF-AFT-INS
Antes
Create trigger T
BEFORE insert ON Cuenta
EnviarMensaje()
T
INSERT...
Despues
Create trigger T
AFTER insert ON Cuenta
EnviarMensaje()
En lugar de
Create trigger T
INSTEAD OF insert ON Cuenta
EnviarMensaje()
INSERT...
T
INSERT...
T
INSERT INTO Cuenta
VALUES (...)
Disparadores inmediatos y vistas
BEFORE y AFTER
– Sólo para tablas de base
– NO para vistas
• si se inserta en una vista y la tabla de base subyacente tiene
un trigger BEFORE o AFTER, entonces sí se dispara.
INSTEAD OF
– Para vistas
• Es una manera transparente de modificar vistas no
modificables.
• Si se sabe cuál es la operación asociada a una inserción en
una tupla, se puede indicar en un trigger la operación
asociada.
Disparadores: Tipos
CREATE TRIGGER <identificador>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
[FOR EACH ROW | STATEMENT ?
Según el nivel
• EACH ROW (A nivel de fila)
– Se dispara el trigger una vez por cada una de las tuplas afectadas
por la sentencia que desencadena el evento
• Insertar 5 tuplas: ?se dispara 5 veces
• Modificar 0 tuplas: ?no se dispara
• Se pueden usar los valores NEW y OLD para referenciar a los
cambios a realizar a la BD.
• STATEMENT (A nivel de Sentencia)
Disparadores: Tipos
CREATE TRIGGER <identificador>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
[FOR EACH ROW | STATEMENT ?
Según el nivel
• EACH ROW (A nivel de fila)
• STATEMENT
Se dispara el trigger una vez por cada sentencia que desencadena el
evento (sin tener en cuenta las tuplas afectadas ni la transacción en
que se encuentren)
Insertar 5 tuplas: ?se dispara 1 vez el trigger.
•
• Modificar 0 tuplas: ?se dispara 1 vez el trigger.
• Se pueden usar las tablas NEW_TABLE y OLD_TABLE para referenciar a los
cambios que se realizan a la BD (SQL Server: INSERTED, DELETED)
Comparación ROW-STAT
Create triggerT
BEFORE update ON Cuenta
FOR EACH ROW
Mensaje()
Create triggerT
BEFORE update ON Cuenta
STATEMENT
Mensaje()
T
Update
T
Update
Update modifica 2 tuplas
Update
Update
T
DBD 2006-2007
Disparadores - Trigger
3
Combinaciones de triggers
BEFORE statement trigger
– Antes de ejecutarse la operación que desencadena el evento se
ejecuta la acción del trigger.
BEFORE row trigger
– Antes de modificar cada una de las filas afectadas por la operación
que desencadena el evento y antes de comprobar las reglas de
integridad se ejecuta la acción del trigger (éstos no bloquean la fila).
AFTER row trigger
– Después de modificar cada una de las filas afectadas por la
operación que desencadena el evento y las reglas de integridad
asociadas, se ejecuta la acción del trigger para la fila actual (éstos
bloquean la fila)
AFTER statement trigger
– Se ejecuta la acción del trigger después de ejecutar la operación que
desencadena el evento y después de aplicar las restricciones
diferidas.
Renombrar a OLD y NEW
CREATE TRIGGER <identificador>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
[FOR EACH ROW | STATEMENT ?
[REFERENCING OLD AS <nombre> NEW AS <nombre>?
[REFERENCING OLD_TABLE AS <nom> NEW_TABLE AS <nom> ?
FOR EACH ROW
REFERENCING OLD AS <nombre> NEW AS <nombre>
- Es posible renombrar las tuplas OLD y NEW
STATEMENT
REFERENCING OLD_TABLE AS <nom> NEW_TABLE AS <nom>
- Es posible renombrar las talbas OLD y NEW
Sintaxis: Disparadores en SQL3
CREATE TRIGGER <identificador>
{AFTER | BEFORE | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF <atributo>?} ON <tabla>
[FOR EACH ROW | STATEMENT ?
[REFERENCING OLD AS <nombre> NEW AS <nombre>?
[REFERENCING OLD_TABLE AS <nom > NEW_TABLE AS <nom > ?
[WHEN <condición> ?
La condiciones pueden ser:
• Bloque de acciones sobre la base de datos
• Llamada a un procedimiento almacenado
• Llamada a una función externa
Estado de triggers
Una regla o trigger, por medio de su nombre, se puede:
– Activar / ENABLE
• Se puede disparar
• Por defecto (Consultar SGBD)
– Desactivar / DISABLE
• No se puede disparar
– Eliminar / DROP
Nota: Se podrían agrupara para facilitar las acciones anteriores .
Sintaxis:
ALTER TRIGGER <identificador> {ENABLE | DISABLE}
DROP TRIGGER <identificador>
Consideración o Acoplamiento
Consideración o Acoplamiento
Cuando se deber realizar la acción activada.
• Antes del evento / BEFORE
• Despues del evento / AFTER
• Simultaneamente al evento / INSTEAD OF
La acción se realiza en la misma transacción o en una nueva
• Consideración Inmediata / INMEDIATE
• Consideración Diferida / DEFERRED
• Consideración Separada / DETACHED
Acoplamiento Inmediato (INMEDIATE)
La condición se evalúa dentro de la misma transacción que la del
evento que la desencadena y se hace inmediatamente
• BEFORE: Se evalúa la condición antes de la ejecución de la operación
• AFTER: Se evalúa la condición después
• INSTEAD OF: Se evalúa la condición en lugar de realizar la operación
Acoplamiento diferido (DEFERRED)
– La condición se evalúa al final de la transacción que contenía l a
operación desencadenadora. En este caso puede haber muchos
triggers esperando a evaluar su condición.
Acoplamiento separado (DETACHED)
– La condición se evalúa dentro de una transacción separada nacida de
la transacción desencadenadora.
DBD 2006-2007
Disparadores - Trigger
4
Acoplamiento inmediato
Acoplamiento diferido
comienzo de transacción
¿condición?
ejecución
acción
final de transacción
Uso: restricciones de integridad
complejas que requieren una
comprobación inmediata
Acoplamiento Inmediato (INMEDIATE)
La condición se evalúa dentro de la misma transacción que
la del evento que la desencadena y se hace inmediatamente
comienzo de transacción
Uso: restricciones de
integridad complejas
diferidas
final de transacción
¿condición?
ejecución
acción
Acoplamiento diferido (DEFERRED)
La condición se evalúa al final de la transacción que contenía l a operación
desencadenadora. En este caso puede haber muchos triggers esperando
a evaluar su condición.
Acoplamiento separado
Ejemplo
comienzo de transacción
Uso: restricciones de
integridad complejas
diferidas
subtransacción
¿condición?
ejecución
acción
fin subtransacción
final de transacción
Acop
Comentarios de: Disparadores - Trigger (0)
No hay comentarios