PostgreSQL - ACTIVADORES

PostgreSQL Triggers son funciones de devolución de llamada de la base de datos, que se ejecutan / invocan automáticamente cuando se produce un evento de base de datos específico.

Los siguientes son puntos importantes sobre los disparadores de PostgreSQL:

  • El disparador de PostgreSQL se puede especificar para disparar

    • Antes de que se intente la operación en una fila (antes de que se verifiquen las restricciones y se intente INSERT, UPDATE o DELETE)

    • Después de que la operación se haya completado (después de que se verifiquen las restricciones y se hayan completado INSERT, UPDATE o DELETE)

    • En lugar de la operación (en el caso de inserciones, actualizaciones o eliminaciones en una vista)

  • Un disparador que está marcado PARA CADA FILA se llama una vez por cada fila que modifica la operación. Por el contrario, un disparador que está marcado PARA CADA DECLARACIÓN solo se ejecuta una vez para una operación determinada, independientemente de cuántas filas modifique.

  • Tanto la cláusula WHEN como las acciones desencadenantes pueden acceder a elementos de la fila que se inserta, borra o actualiza utilizando referencias del formulario NEW.column-name y OLD.column-name, donde nombre-columna es el nombre de una columna de la tabla con la que está asociado el desencadenador.

  • Si se proporciona una cláusula WHEN, las declaraciones de PostgreSQL especificadas solo se ejecutan para las filas para las que la cláusula WHEN es verdadera. Si no se proporciona una 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 ejecutarán las acciones de activación en relación con la inserción, modificación o eliminación de la fila asociada.

  • Los activadores se eliminan automáticamente cuando se elimina la tabla a 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 se adjunta el disparador y se debe usar solo tablenameno database.tablename.

  • Una opción CONSTRAINT cuando se especifica crea un activador de restricción . Esto es lo mismo que un gatillo normal, excepto que la sincronización del disparo del gatillo se puede ajustar usando SET CONSTRAINTS. Se espera que los activadores de restricciones generen una excepción cuando se violen las restricciones que implementan.

Sintaxis

La sintaxis básica para crear un trigger es como sigue -

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

Aquí, event_namepodría ser INSERT, DELETE, UPDATE y TRUNCATE operación de base de datos en la tabla mencionadatable_name. Opcionalmente, puede especificar PARA CADA FILA después del nombre de la tabla.

La siguiente es la sintaxis de la creación de un disparador en una operación UPDATE en una o más columnas especificadas de una tabla 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 prueba de auditoría para cada registro que se inserta en la tabla EMPRESA, que crearemos nuevamente de la siguiente manera (elimine la tabla EMPRESA si ya la tiene).

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

Para mantener la prueba de 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 AUDIT, y EMP_ID es el ID, que vendrá de la tabla COMPANY, y DATE mantendrá la marca de tiempo cuando el registro se creará en la tabla COMPANY. Así que ahora, creemos un disparador en la tabla EMPRESA de la siguiente manera:

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

Donde auditlogfunc () es un PostgreSQL procedure 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, comenzaremos el trabajo real. Comencemos insertando un registro en la tabla EMPRESA que debería resultar en la creación de un registro de auditoría en la tabla AUDIT. Así que creemos un registro en la tabla EMPRESA de la siguiente manera:

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 es el siguiente:

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 hemos creado en la operación INSERTAR en la tabla EMPRESA. Del mismo modo, puede crear sus activadores en las operaciones 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 gatillos

Puede enumerar todos los disparadores en la base de datos actual desde pg_trigger tabla de la siguiente manera:

testdb=# SELECT * FROM pg_trigger;

La declaración de PostgreSQL dada anteriormente enumerará todos los disparadores.

Si desea enumerar los disparadores en una tabla en particular, 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 dada anteriormente también enumerará solo una entrada de la siguiente manera:

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

Soltando GATILLOS

El siguiente es el comando DROP, que se puede usar para eliminar un disparador existente:

testdb=# DROP TRIGGER trigger_name;