Disparadores
Desliza para mostrar el menú
Disparadores en bases de datos son tipos especiales de procedimientos almacenados que se ejecutan automáticamente o se activan en respuesta a ciertos eventos o acciones que ocurren en la base de datos.
Estos eventos pueden incluir inserciones, actualizaciones o eliminaciones de datos en tablas y cambios en objetos del esquema de la base de datos como tablas o vistas.
Disparadores DML
Un disparador DML, también conocido como disparador de Lenguaje de Manipulación de Datos, es un objeto de base de datos que ejecuta automáticamente una acción especificada cuando ocurre un determinado evento en una tabla o vista.
Los disparadores DML se utilizan a menudo para hacer cumplir reglas de negocio, mantener la integridad de los datos o realizar tareas de auditoría.
Tipos de disparadores DML
- Disparadores After: Estos disparadores se activan después de que la acción desencadenante (insertar, actualizar, eliminar) se haya ejecutado en la tabla;
- Disparadores Before: Estos disparadores se activan antes de la acción desencadenante. Permiten interceptar la acción original y ejecutar lógica personalizada antes de decidir si continuar o no con la acción original.
Ejemplo de disparador After
Anteriormente exploramos un ejemplo de uso de una transacción para agregar valores a la tabla BankAccounts y a la tabla UserLogs como una sola unidad lógica en la primera sección de este curso.
Ahora, en lugar de usar una transacción, podemos lograr esto creando un disparador AFTER en la operación INSERT dentro de la tabla BankAccounts.
Como resultado, solo podremos insertar nuevas cuentas, y el valor de registro correspondiente se agregará automáticamente mediante el disparador.
12345678910111213141516-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
-
Crear un disparador after insert para user_logs:
- Crear una función llamada
afterinserttriggerfunction(). - La función está definida para devolver un trigger.
- El cuerpo de la función comienza con un bloque
BEGIN. - Dentro del bloque
BEGIN, se realiza una acción, que es insertar un registro en la tablauserlogs. - El registro insertado contiene valores de la fila
NEWdel evento desencadenante. - Los valores insertados incluyen
accountnumbery una cadena concatenada que menciona la acción. - La función devuelve la fila
NEW. - La función está escrita en el lenguaje
plpgsql.
- Crear una función llamada
-
Asociar el disparador a la tabla bankaccounts:
- Se crea un disparador llamado
afterinserttrigger. - El disparador está configurado para ejecutarse después de una operación
INSERTen la tablabankaccounts. - El disparador está configurado para ejecutar la función
afterinserttriggerfunctionpara cada fila afectada.
- Se crea un disparador llamado
En los triggers de PostgreSQL, NEW es una variable de registro especial que representa la nueva fila insertada o actualizada en la tabla. Permite acceder a los valores de las columnas en la nueva fila dentro de la función del trigger.
Si trabajamos con filas eliminadas, debemos usar la variable de registro OLD en lugar de NEW.
Ejemplo de trigger BEFORE
Supongamos que queremos evitar agregar valores con un saldo de cuenta negativo. Podemos crear un trigger BEFORE para lograr esto. Este trigger verificará el saldo antes de la operación y, si es negativo, la operación no se realizará.
12345678910111213141516171819202122232425-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
-
Crear la función del trigger:
- Crear o reemplazar una función llamada
before_insert_userlogs(). - La función está definida para retornar un trigger.
- El cuerpo de la función comienza con un bloque
BEGIN. - Dentro del bloque
BEGIN, una condición verifica si el saldo de la cuenta es menor que 0. - Si el saldo es menor que 0, se genera un aviso y no se registra ninguna acción. La función retorna NULL para evitar la inserción.
- Si el saldo es mayor o igual a 0, se genera un aviso indicando que la acción se registra.
- La función luego inserta un registro en la tabla
userlogs, que contiene valores de la filaNEW. - Los valores insertados incluyen
accountnumbery una cadena concatenada que indica la acción. - La función retorna
NEWpara permitir que la inserción continúe. - La función está escrita en el lenguaje
plpgsql.
- Crear o reemplazar una función llamada
-
Crear el trigger:
- Se crea un trigger llamado
before_insert_userlogs_trigger. - El trigger está configurado para ejecutarse antes de una operación
INSERTen la tablabankaccounts. - El trigger está configurado para ejecutar la función
before_insert_userlogs()para cada fila afectada.
- Se crea un trigger llamado
Patrón de creación de triggers
Se puede observar el patrón típico para crear triggers: inicialmente, se define una función para ejecutar una lógica específica antes o después de una operación. Posteriormente, se asocia esta función como un trigger a una tabla y acción designadas.
Tenga en cuenta que en la siguiente sentencia:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
tenemos la flexibilidad de utilizar UPDATE o DELETE en lugar de la operación INSERT.
Pero preste atención a que no se pueden crear triggers para SELECT, ya que la sentencia SELECT no modifica ninguna fila en la tabla.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Disparadores
Disparadores en bases de datos son tipos especiales de procedimientos almacenados que se ejecutan automáticamente o se activan en respuesta a ciertos eventos o acciones que ocurren en la base de datos.
Estos eventos pueden incluir inserciones, actualizaciones o eliminaciones de datos en tablas y cambios en objetos del esquema de la base de datos como tablas o vistas.
Disparadores DML
Un disparador DML, también conocido como disparador de Lenguaje de Manipulación de Datos, es un objeto de base de datos que ejecuta automáticamente una acción especificada cuando ocurre un determinado evento en una tabla o vista.
Los disparadores DML se utilizan a menudo para hacer cumplir reglas de negocio, mantener la integridad de los datos o realizar tareas de auditoría.
Tipos de disparadores DML
- Disparadores After: Estos disparadores se activan después de que la acción desencadenante (insertar, actualizar, eliminar) se haya ejecutado en la tabla;
- Disparadores Before: Estos disparadores se activan antes de la acción desencadenante. Permiten interceptar la acción original y ejecutar lógica personalizada antes de decidir si continuar o no con la acción original.
Ejemplo de disparador After
Anteriormente exploramos un ejemplo de uso de una transacción para agregar valores a la tabla BankAccounts y a la tabla UserLogs como una sola unidad lógica en la primera sección de este curso.
Ahora, en lugar de usar una transacción, podemos lograr esto creando un disparador AFTER en la operación INSERT dentro de la tabla BankAccounts.
Como resultado, solo podremos insertar nuevas cuentas, y el valor de registro correspondiente se agregará automáticamente mediante el disparador.
12345678910111213141516-- Create an after-insert trigger for UserLogs CREATE FUNCTION after_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Perform some action, like logging the insert INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder)); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Attach the trigger to the BankAccounts table CREATE TRIGGER after_insert_trigger AFTER INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger_function();
-
Crear un disparador after insert para user_logs:
- Crear una función llamada
afterinserttriggerfunction(). - La función está definida para devolver un trigger.
- El cuerpo de la función comienza con un bloque
BEGIN. - Dentro del bloque
BEGIN, se realiza una acción, que es insertar un registro en la tablauserlogs. - El registro insertado contiene valores de la fila
NEWdel evento desencadenante. - Los valores insertados incluyen
accountnumbery una cadena concatenada que menciona la acción. - La función devuelve la fila
NEW. - La función está escrita en el lenguaje
plpgsql.
- Crear una función llamada
-
Asociar el disparador a la tabla bankaccounts:
- Se crea un disparador llamado
afterinserttrigger. - El disparador está configurado para ejecutarse después de una operación
INSERTen la tablabankaccounts. - El disparador está configurado para ejecutar la función
afterinserttriggerfunctionpara cada fila afectada.
- Se crea un disparador llamado
En los triggers de PostgreSQL, NEW es una variable de registro especial que representa la nueva fila insertada o actualizada en la tabla. Permite acceder a los valores de las columnas en la nueva fila dentro de la función del trigger.
Si trabajamos con filas eliminadas, debemos usar la variable de registro OLD en lugar de NEW.
Ejemplo de trigger BEFORE
Supongamos que queremos evitar agregar valores con un saldo de cuenta negativo. Podemos crear un trigger BEFORE para lograr esto. Este trigger verificará el saldo antes de la operación y, si es negativo, la operación no se realizará.
12345678910111213141516171819202122232425-- Create the trigger function CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$ BEGIN -- Check if the account balance is less than 0 IF (NEW.balance < 0) THEN -- If balance is less than 0, do nothing and return RAISE NOTICE 'Balance is less than 0. Action not logged.'; ELSE -- If balance is greater than or equal to 0, log the action RAISE NOTICE 'Logging insert into UserLogs'; -- Inserting into the UserLogs table INSERT INTO UserLogs (account_number, action) VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder)); END IF; -- Indicate that the trigger function has completed successfully RETURN NULL; END; $$ LANGUAGE plpgsql; -- Create the trigger CREATE TRIGGER before_insert_trigger BEFORE INSERT ON BankAccounts FOR EACH ROW EXECUTE PROCEDURE before_insert_trigger_function();
-
Crear la función del trigger:
- Crear o reemplazar una función llamada
before_insert_userlogs(). - La función está definida para retornar un trigger.
- El cuerpo de la función comienza con un bloque
BEGIN. - Dentro del bloque
BEGIN, una condición verifica si el saldo de la cuenta es menor que 0. - Si el saldo es menor que 0, se genera un aviso y no se registra ninguna acción. La función retorna NULL para evitar la inserción.
- Si el saldo es mayor o igual a 0, se genera un aviso indicando que la acción se registra.
- La función luego inserta un registro en la tabla
userlogs, que contiene valores de la filaNEW. - Los valores insertados incluyen
accountnumbery una cadena concatenada que indica la acción. - La función retorna
NEWpara permitir que la inserción continúe. - La función está escrita en el lenguaje
plpgsql.
- Crear o reemplazar una función llamada
-
Crear el trigger:
- Se crea un trigger llamado
before_insert_userlogs_trigger. - El trigger está configurado para ejecutarse antes de una operación
INSERTen la tablabankaccounts. - El trigger está configurado para ejecutar la función
before_insert_userlogs()para cada fila afectada.
- Se crea un trigger llamado
Patrón de creación de triggers
Se puede observar el patrón típico para crear triggers: inicialmente, se define una función para ejecutar una lógica específica antes o después de una operación. Posteriormente, se asocia esta función como un trigger a una tabla y acción designadas.
Tenga en cuenta que en la siguiente sentencia:
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;
tenemos la flexibilidad de utilizar UPDATE o DELETE en lugar de la operación INSERT.
Pero preste atención a que no se pueden crear triggers para SELECT, ya que la sentencia SELECT no modifica ninguna fila en la tabla.
¡Gracias por tus comentarios!