Está en la página 1de 44

Sesión 16

Triggers

Mtro. Anastacio Rodríguez García


Universidad Tecnológica del Norte de Guanajuato

18 de Junio de 2020
Resumen

Un desencadenador, disparador o TRIGGER en


PostgreSQL es una función invocada
automáticamente cada vez que ocurre un evento,
por ejemplo, insertar, actualizar o eliminar.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 2 / 44
Trigger

Un desencadenador PostgreSQL es una


función invocada automáticamente cada vez
que ocurre un evento asociado con una
tabla.
Un evento puede ser cualquiera de los
siguientes: INSERTAR, ACTUALIZAR,
BORRAR o TRUNCAR.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 3 / 44
Los disparadores
Un disparador es una función especial
denida por el usuario asociada con una
tabla.
Para crear un nuevo desencadenador,
primero debe denir una función
desencadenante y luego vincular esta
función desencadenante a una tabla.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 4 / 44
La diferencia...

La diferencia entre un desencadenador y una


función denida por el usuario es que un
desencadenante se invoca automáticamente
cuando se produce un evento.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 5 / 44
Tipos de triggers

Desencadenantes de la y de nivel de


instrucción.
Las diferencias entre los dos tipos son
cuántas veces se invoca el disparador y a
qué hora.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 6 / 44
Ejemplo:

Si emite una instrucción UPDATE que


afecta a 20 las, el activador de nivel de la
se invocará 20 veces, mientras que el
activador de nivel de instrucción se invocará
1 vez.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 7 / 44
Puede especicar si el trigger se invoca
antes o después de un evento.
Si el trigger se invoca antes de un evento,
puede omitir la operación para la la actual
o incluso cambiar la la que se está
actualizando o insertando.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 8 / 44
En caso de que se invoque el trigger
después del evento, todos los cambios están
disponibles para el trigger.
Los disparadores son útiles en caso de que
varias aplicaciones accedan a la base de
datos, y desea mantener la funcionalidad
cruzada dentro de la base de datos que se
ejecuta automáticamente cada vez que se
modican los datos de la tabla.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18de
deGuanajuato)
Junio de 2020 9 / 44
Ejemplo

Si desea mantener el historial de datos sin


requerir que la aplicación tenga lógica para
vericar cada evento como INSERT o
UDPATE.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 10 / 44
También puede usar trigger para mantener
reglas complejas de integridad de datos que
no puede implementar en ningún otro lugar,
excepto en el nivel de la base de datos.
Por ejemplo, cuando se agrega una nueva
la a la tabla de clientes, también se deben
crear otras las en tablas de bancos y
créditos.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 11 / 44
El principal inconveniente de usar un
disparador es que debe saber que el
disparador existe y comprender su lógica
para descubrir los efectos cuando cambian
los datos.
Aunque PostgreSQL implementa el estándar
SQL, los disparadores en PostgreSQL tienen
algunas características especícas.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 12 / 44
Singularidades en PostgreSQL
Se dispara disparador para el evento
TRUNCATE.
Te permite denir el trigger de nivel de
instrucción en las vistas.
Requiere que dena una función denida
por el usuario como la acción del trigger,
mientras que el estándar SQL le permite
usar cualquier número de comandos SQL.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 13 / 44
Creando Trigger

1 Crea una función desencadenante utilizando


la instrucción CREATE FUNCTION.
2 Vincula la función de activación a una tabla
utilizando la instrucción CREATE
TRIGGER.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 14 / 44
Creando una función de trigger
Una función de disparo es similar a una función
ordinaria. Sin embargo, una función de
activación no toma ningún argumento y tiene un
valor de retorno con el tipo de activación.

CREATE FUNCTION
trigger_function()
RETURNS trigger AS

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 15 / 44
Nota que puede crear una función de
activación utilizando cualquier lenguaje
compatible con PostgreSQL.
Una función de trigger recibe datos sobre su
entorno de llamada a través de una
estructura especial llamada TriggerData,
que contiene un conjunto de variables
locales.
OLD y NEW representan los estados de la
la en la tabla antes o después del evento
de Trigger.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 16 / 44
Sintaxis

CREATE TRIGGER trigger_name


BEFORE | AFTER | INSTEAD OF
event [OR ...]
ON table_name
FOR [EACH ROW | STATEMENT]
EXECUTE PROCEDURE
trigger_function

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 17 / 44
Explicación

El evento puede ser INSERT, UPDATE,


DELETE o TRUNCATE. Puede denir un
trigger que se dispare antes (ANTES) o después
del evento (DESPUÉS). INSTEAD OF se usa
solo para INSERT, UPDATE o DELETE en una
vista.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 18 / 44
PostgreSQL, PostgreSQL admite dos tipos de
activadores: trigger de nivel de la y trigger de
nivel de instrucción, que se puede especicar
mediante la cláusula FOR EACH ROW y FOR
EACH STATEMENT (activador de nivel de
instrucción) cláusula.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 19 / 44
Comenzamos el ejemplo
Crearemos la tabla empleado con 3 campos id,
nombre y apellido.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 20 / 44
Comenzamos el ejemplo
Crearemos la tabla empleado con 3 campos id,
nombre y apellido.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 21 / 44
Crearemos la tabla auditoría de empleados con el
id de empleado, apellido y fecha de cambio.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 22 / 44
Hacemos la tabla auditoria de empleados con el
id de empleado, apellido y fecha de cambio.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 23 / 44
Hacemos la tabla auditoria de empleados con el
id de empleado, apellido y fecha de cambio.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 24 / 44
Creamos la función del trigger

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 25 / 44
La función inserta el apellido anterior en la
tabla employee_audits, incluido el id del
empleado, el apellido y la fecha del cambio
si cambia el apellido de un empleado.
En segundo lugar, vincula la función del
trigger a la tabla de empleados.
El nombre del trigger es
last_name_changes.
Antes de actualizar el valor de la columna
last_name, la función del trigger se invoca
automáticamente para registrar los cambios.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 26 / 44
Creación del Trigger

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 27 / 44
Supongamos que Lily Bush se casa y necesita cambiar su

apellido a Lily Brown, posteriormente a Stephenson.


Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 28 / 44
Resultado

Cada que haces un cambio en el apellido del


empleado, es vericable en la tabla auditoría de
empleado.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 29 / 44
DROP TRIGGER

Para eliminar un desencadenador de una tabla,


utiliza la instrucción DROP TRIGGER con la
siguiente sintaxis:
DROP TRIGGER [IF EXISTS]
trigger_name ON table_name [ CASCADE |
RESTRICT ];

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 30 / 44
Explicación de sintaxis
Especica el nombre del trigger, el cual
tienes que borrar después de las palabras
DROP TRIGGER.
Usa IF EXISTS para condicionar el borrado
solo que exista. Si intentas eliminar un
trigger no existe marcará un error.
Especica el nombre de la tabla a la que
pertenece el trigger, puede ser incluyendo el
esquema.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 31 / 44
Usa la opción CASCADE, si deseas borrar
objetos que dependan en el trigger
automáticamente. Permitirá también borrar
objetos que dependan en el trigger.
Usa RESTRICT TO rechazar el borrado el
trigger si algún objeto depende de él. Por
defecto, se usa RESTRICT.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 32 / 44
Crea una trigger function
Valida el usuario de un sta:

El usuario no debe ser nulo y su longitud es de al


menos 8 caracteres.
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 33 / 44
Crea un nuevo trigger

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 34 / 44
Vista del trigger y función

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 35 / 44
Borrar el trigger

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 36 / 44
Modicar un Trigger
Para modicar un trigger, se usa la
instrucción ALTER TRIGGER.
Esta instrucción es una extensión del
estándar de SQL.
Esta es la sintaxis de la instrucción ALTER
TRIGGER.
ALTER TRIGGER trigger_name ON
table_name RENAME TO new_name;
Mtro. Anastacio Rodríguez García (Universidad
Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 37 / 44
Explicación de la sintaxis

Especicamos el nombre del trigger


asociado con una tabla en particular que
deseas cambiar.
Pones el nombre nuevo del trigger en la
clausula RENAME.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 38 / 44
Ejemplo
Si tu deseas cambiar el trigger
last_name_changes, el cual esta asociado
con la tabla de empleados a
log_last_name_changes.
Usa la instrucción ALTER TRIGGER:

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 39 / 44
Deshabilitando el trigger

No se proporciona una instrucción especica


como DISABLE TRIGGER, para
deshabilitar un trigger existente.
Sin embargo, puedes deshabilitarlo usando
ALTER TABLE.
ALTER TABLE table_name DISABLE
TRIGGER trigger_name | ALL

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 40 / 44
Especicas el nombre del trigger, el cual
quieres deshabilitar, después de las palabras
DISABLE TRIGGER.
Para deshabilitar todos los triggers
asociados con una tabla, usas ALL en lugar
de un nombre de trigger en particular.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 41 / 44
Para deshabilitar todos los trigger asociados con
la tabla de empleados, debes de usar esta
instrucción

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 42 / 44
Borrando el trigger

Para borrar una denición de trigger existente,


usas la instrucción DROP TRIGGER:
DROP TRIGGER [IF EXISTS] trigger_name ON
table_name [RESTRICT | CASCADE]
Especicamos el nombre del trigger que deseas
borrar despues de DROP TRIGGER y la tabla
asociada, usamos IF EXISTS para evitar error.

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 43 / 44
Ejemplo

Mtro. Anastacio Rodríguez García (Universidad


Sesión
Tecnológica
16 del Norte
18 de
de Guanajuato)
Junio de 2020 44 / 44

También podría gustarte