PostgreSQL – ACTIVADORES

PostgreSQL Disparadores son funciones de devolución de llamada de la base de datos que se ejecutan / llaman automáticamente cuando ocurre un evento específico de la base de datos.

Los siguientes son puntos importantes sobre los disparadores de PostgreSQL:

  • Puede especificar un disparador de PostgreSQL para disparar

    • Antes de intentar una operación en una fila (antes de verificar las restricciones e intentar INSERT, UPDATE o DELETE)

    • Después de que se complete la operación (después de verificar las restricciones y realizar una INSERCIÓN, ACTUALIZACIÓN o ELIMINACIÓN)

    • En lugar de una operación (en caso de insertar, actualizar o eliminar en la vista)

  • Un disparador marcado PARA CADA FILA se llama una vez por cada fila que cambia la operación. Por el contrario, un desencadenador marcado PARA CADA DECLARACIÓN se ejecuta solo una vez para cualquier operación determinada, sin importar cuántas filas cambie.

  • Tanto la cláusula WHEN como las acciones de activación pueden acceder a los elementos de la fila que se inserta, elimina o actualiza mediante enlaces en el formulario NEW.nombre-columna y ANTIGUO.nombre-columnadonde nombre-columna es el nombre de la columna de la tabla con la que está asociado el desencadenador.

  • Si se especifica una cláusula WHEN, las declaraciones de PostgreSQL especificadas se ejecutan solo para las filas para las que la cláusula WHEN es verdadera. Si no se especifica ninguna cláusula WHEN, las declaraciones de PostgreSQL se ejecutan para todas las filas.

  • Si se definen varios disparadores del mismo tipo para el mismo evento, se dispararán en orden alfabético por nombre.

  • La palabra clave BEFORE, AFTER o INSTEAD OF determina cuándo se realizarán las acciones de activación con respecto a la inserción, modificación o eliminación de una fila vinculada.

  • Los desencadenadores se eliminan automáticamente cuando se elimina la tabla con la que están asociados.

  • La tabla que se va a modificar debe existir en la misma base de datos que la tabla o vista a la que está vinculado el disparador, y solo debe usarse nombre de la tabla, no database.tablename

  • La opción CONSTRAINT, si se especifica, crea límite de activación… Esto es lo mismo que un disparo normal, excepto que el tiempo de disparo se puede ajustar usando SET CONSTRAINTS. Se espera que los activadores de restricciones generen una excepción si se violan las restricciones que implementan.

Sintaxis

Sintaxis de creación básica desencadenar como sigue –

CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- Trigger logic goes here....
];

Aquí, nombre del evento tal vez INSERTAR, BORRAR, ACTUALIZAR, y TRUNCAR operación de la base de datos en la tabla especificada nombre de la tabla… Opcionalmente, puede especificar PARA CADA FILA después del nombre de la tabla.

A continuación se muestra la sintaxis para crear un desencadenante para una operación ACTUALIZAR en una o más columnas de la tabla especificadas de la siguiente manera:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Trigger logic goes here....
];

Ejemplo

Consideremos un caso en el que queremos mantener una muestra de control para cada registro insertado en la tabla EMPRESA que crearemos de la siguiente manera (Elimine la tabla EMPRESA si ya tiene una).

testdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Para continuar con la auditoría, crearemos una nueva tabla llamada AUDIT donde se insertarán mensajes de registro cada vez que haya una entrada en la tabla EMPRESA para un nuevo registro –

testdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

Aquí ID es el ID del registro de AUDITORÍA y EMP_ID es el ID que se tomará de la tabla EMPRESA y DATE almacenará la marca de tiempo cuando se cree el registro en la tabla EMPRESA. Así que ahora creemos un disparador para la tabla EMPRESA como este:

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

Donde auditlogfunc () es PostgreSQL procedimiento y tiene la siguiente definición:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
   BEGIN
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$example_table$ LANGUAGE plpgsql;

Ahora vayamos al trabajo en sí. Comencemos insertando un registro en la tabla EMPRESA, lo que debería resultar en la creación de un registro de auditoría en la tabla AUDITORÍA. Así que creemos un registro en la tabla EMPRESA como este:

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

Esto creará un registro en la tabla EMPRESA que se ve así:

 id | name | age | address      | salary
----+------+-----+--------------+--------
  1 | Paul |  32 | California   |  20000

Al mismo tiempo, se creará un registro en la tabla AUDIT. Este registro es el resultado de un disparador que creamos para la operación INSERTAR en la tabla EMPRESA. Del mismo modo, puede crear sus propios activadores ACTUALIZAR y ELIMINAR según sus requisitos.

 emp_id |          entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

Listado de ACTIVADORES

Puede enumerar todos los desencadenantes en la base de datos actual desde pg_trigger la tabla es la siguiente:

testdb=# SELECT * FROM pg_trigger;

La declaración de PostgreSQL anterior enumerará todos los desencadenantes.

Si desea enumerar los desencadenadores en una tabla específica, use la cláusula AND con el nombre de la tabla de la siguiente manera:

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname="company";

La declaración de PostgreSQL anterior también enumerará solo un registro como este:

     tgname
-----------------
 example_trigger
(1 row)

Soltando GATILLOS

A continuación se muestra el comando DROP que puede usar para eliminar un disparador existente:

testdb=# DROP TRIGGER trigger_name;

🚫