English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos PostgreSQL

Tutoriales avanzados PostgreSQL

Interfaz PostgreSQL

Trigger de PostgreSQL

Los desencadenadores PostgreSQL son funciones de devolución de llamada de la base de datos, que se ejecutan automáticamente cuando ocurre un evento de base de datos especificado./Llamada.

A continuación, se presentan algunos puntos importantes sobre los desencadenadores PostgreSQL:

  • Los desencadenadores PostgreSQL pueden activarse en las siguientes situaciones:

    • Antes de ejecutar la operación (antes de verificar la restricción y intentar insertar, actualizar o eliminar).

    • Después de ejecutar la operación (después de verificar la restricción y completar la inserción, actualización o eliminación).

    • Operación de actualización (al insertar, actualizar o eliminar en una vista).

  • El atributo FOR EACH ROW del desencadenador es opcional, si se selecciona, se llama a cada fila cuando se realiza la modificación; por el contrario, si se selecciona FOR EACH STATEMENT, el desencadenador marcado por cada sentencia se ejecuta una vez, sin importar cuántas filas se hayan modificado.

  • La cláusula WHEN y la operación del desencadenador se refieren a NEW.column-name y OLD.column-name puede acceder a cada elemento de la fila al insertar, eliminar o actualizar el formulario. Donde column-name es el nombre de la columna de la tabla asociada con el desencadenador.

  • Si existe una cláusula WHEN, la sentencia PostgreSQL solo ejecutará la fila en la que se cumpla WHEN, si no hay cláusula WHEN, la sentencia PostgreSQL ejecutará en cada fila.

  • Las palabras clave BEFORE o AFTER determinan cuándo se ejecuta la acción del desencadenador, decidiendo si se ejecuta antes o después de la inserción, modificación o eliminación de las filas relacionadas.

  • La tabla a modificar debe existir en la misma base de datos, como tabla o vista a la que se adjunta el desencadenador, y debe usar solo tablename, no database.tablename.

  • Al crear un desencadenador de restricción se especifican las opciones de restricción. Esto es lo mismo que un desencadenador común, solo que se puede usar esta restricción para ajustar el tiempo en que se desencadena el desencadenador. Cuando se viola la restricción implementada por el desencadenador de restricción, lanzará una excepción.

Sintaxis

La sintaxis básica para crear un desencadenador es la siguiente:

CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- Lógica del desencadenador...
];

Aquí, event_name puede ser una operación de base de datos INSERT, DELETE y UPDATE en la tabla table_name mencionada. Puede elegir especificar FOR EACH ROW después del nombre de la tabla.

La sintaxis para crear un desencadenador en una o más columnas específicas de una tabla es la siguiente:

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Lógica del desencadenador...
];

Ejemplo en línea

Supongamos una situación, queremos mantener un experimento de auditoría para cada registro insertado en la tabla COMPANY recién creada (si ya existe, se eliminará y se creará de nuevo):

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

Para mantener el experimento de auditoría, crearemos una nueva tabla llamada AUDIT. Cada vez que haya un nuevo elemento en la tabla COMPANY, se insertará un mensaje de registro:

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

Aquí, ID es el ID del registro AUDIT, EMP_ID es el ID procedente de la tabla COMPANY, DATE mantendrá la marca de tiempo de creación del registro en COMPANY. Por lo tanto, ahora creamos un desencadenador en la tabla COMPANY según se muestra a continuación:

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

auditlogfunc() es un programa de PostgreSQL, su definición es la siguiente:

CREAR O REEMPLAZAR FUNCIÓN auditlogfunc() RETORNA DESENCADENADOR AS $example_table$
   INICIO;
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETORNAR NEW;
   FIN;
$example_table$ LANGUAGE plpgsql;

现在,我们开始往 COMPANY 表中插入数据:

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

这时,COMPANY 表中插入了一条记录:

同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:

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

列出触发器

你可以把从 pg_trigger 表中把当前数据库所有触发器列举出来:

w3codeboxdb=# SELECT * FROM pg_trigger;

如果你想列举出特定表的触发器,语法如下:

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

得到结果如下:

 tgname
-----------------
 eje_desencadenador
(1 fila)

删除触发器

删除触发器的基本语法如下:

eliminar desencadenador ${trigger_name} en ${tabla_dependiente_del_desencadenador};

删除本文上表 company 上的触发器 example_trigger 的指令为:

eliminar desencadenador ejemplo_trigger en company;