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.
Nota
Los disparadores no pueden ser invocados explícitamente por los usuarios. En su lugar, se ejecutan automáticamente en respuesta a las operaciones con las que están asociados.
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 frecuentemente 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.
-- 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();
Nota
En los disparadores 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 disparador.
Si trabajamos con filas eliminadas, debemos usar la variable de registroOLD
en lugar deNEW
.
Ejemplo de disparador Before
Supongamos que queremos impedir agregar valores con un saldo de cuenta negativo. Podemos crear un disparador BEFORE
para lograr esto. Este disparador verificará el saldo antes de la operación, y si es negativo, la operación no se realizará.
-- 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();
Patrón de creación de triggers
Podemos observar el patrón típico para crear triggers: inicialmente, definimos una función para ejecutar una lógica específica antes o después de una operación. Posteriormente, asociamos esta función como un trigger a una tabla y acción designadas.
Tenga en cuenta que en la siguiente instrucción:
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 podemos crear triggers para SELECT
, ya que la instrucción 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
Awesome!
Completion rate improved to 4.35
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.
Nota
Los disparadores no pueden ser invocados explícitamente por los usuarios. En su lugar, se ejecutan automáticamente en respuesta a las operaciones con las que están asociados.
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 frecuentemente 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.
-- 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();
Nota
En los disparadores 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 disparador.
Si trabajamos con filas eliminadas, debemos usar la variable de registroOLD
en lugar deNEW
.
Ejemplo de disparador Before
Supongamos que queremos impedir agregar valores con un saldo de cuenta negativo. Podemos crear un disparador BEFORE
para lograr esto. Este disparador verificará el saldo antes de la operación, y si es negativo, la operación no se realizará.
-- 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();
Patrón de creación de triggers
Podemos observar el patrón típico para crear triggers: inicialmente, definimos una función para ejecutar una lógica específica antes o después de una operación. Posteriormente, asociamos esta función como un trigger a una tabla y acción designadas.
Tenga en cuenta que en la siguiente instrucción:
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 podemos crear triggers para SELECT
, ya que la instrucción SELECT
no modifica ninguna fila en la tabla.
¡Gracias por tus comentarios!