Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Disparadores | Algunos Temas Adicionales
Optimización de SQL y Características de Consulta

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();
Descripción de la consulta
expand arrow
  • 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 tabla userlogs.
    • El registro insertado contiene valores de la fila NEW del evento desencadenante.
    • Los valores insertados incluyen accountnumber y una cadena concatenada que menciona la acción.
    • La función devuelve la fila NEW.
    • La función está escrita en el lenguaje plpgsql.
  • 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 INSERT en la tabla bankaccounts.
    • El disparador está configurado para ejecutar la función afterinserttriggerfunction para cada fila afectada.
Note
Nota

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();
Descripción de la consulta
expand arrow
  • 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 fila NEW.
    • Los valores insertados incluyen accountnumber y una cadena concatenada que indica la acción.
    • La función retorna NEW para permitir que la inserción continúe.
    • La función está escrita en el lenguaje plpgsql.
  • Crear el trigger:

    • Se crea un trigger llamado before_insert_userlogs_trigger.
    • El trigger está configurado para ejecutarse antes de una operación INSERT en la tabla bankaccounts.
    • El trigger está configurado para ejecutar la función before_insert_userlogs() para cada fila afectada.

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.

question mark

¿Cuál es el propósito principal de utilizar triggers en una base de datos?

Selecciona la respuesta correcta

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 1

Pregunte a AI

expand

Pregunte a AI

ChatGPT

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();
Descripción de la consulta
expand arrow
  • 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 tabla userlogs.
    • El registro insertado contiene valores de la fila NEW del evento desencadenante.
    • Los valores insertados incluyen accountnumber y una cadena concatenada que menciona la acción.
    • La función devuelve la fila NEW.
    • La función está escrita en el lenguaje plpgsql.
  • 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 INSERT en la tabla bankaccounts.
    • El disparador está configurado para ejecutar la función afterinserttriggerfunction para cada fila afectada.
Note
Nota

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();
Descripción de la consulta
expand arrow
  • 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 fila NEW.
    • Los valores insertados incluyen accountnumber y una cadena concatenada que indica la acción.
    • La función retorna NEW para permitir que la inserción continúe.
    • La función está escrita en el lenguaje plpgsql.
  • Crear el trigger:

    • Se crea un trigger llamado before_insert_userlogs_trigger.
    • El trigger está configurado para ejecutarse antes de una operación INSERT en la tabla bankaccounts.
    • El trigger está configurado para ejecutar la función before_insert_userlogs() para cada fila afectada.

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 3. Capítulo 1
some-alt