Database

Postgres Triggers

Automatically execute SQL on table events.


In Postgres, a trigger executes a set of actions automatically on table events such as INSERTs, UPDATEs, DELETEs, or TRUNCATE operations.

Creating a trigger

Creating triggers involve 2 parts:

  1. A Function which will be executed (called the Trigger Function)
  2. The actual Trigger object, with parameters around when the trigger should be run.

An example of a trigger is:


_10
create trigger "trigger_name"
_10
after insert on "table_name"
_10
for each row
_10
execute function trigger_function();

Trigger functions

A trigger function is a user-defined Function that Postgres executes when the trigger is fired.

Example trigger function

Here is an example that updates salary_log whenever an employee's salary is updated:


_16
-- Example: Update salary_log when salary is updated
_16
create function update_salary_log()
_16
returns trigger
_16
language plpgsql
_16
as $$
_16
begin
_16
insert into salary_log(employee_id, old_salary, new_salary)
_16
values (new.id, old.salary, new.salary);
_16
return new;
_16
end;
_16
$$;
_16
_16
create trigger salary_update_trigger
_16
after update on employees
_16
for each row
_16
execute function update_salary_log();

Trigger variables

Trigger functions have access to several special variables that provide information about the context of the trigger event and the data being modified. In the example above you can see the values inserted into the salary log are old.salary and new.salary - in this case old specifies the previous values and new specifies the updated values.

Here are some of the key variables and options available within trigger functions:

  • TG_NAME: The name of the trigger being fired.
  • TG_WHEN: The timing of the trigger event (BEFORE or AFTER).
  • TG_OP: The operation that triggered the event (INSERT, UPDATE, DELETE, or TRUNCATE).
  • OLD: A record variable holding the old row's data in UPDATE and DELETE triggers.
  • NEW: A record variable holding the new row's data in UPDATE and INSERT triggers.
  • TG_LEVEL: The trigger level (ROW or STATEMENT), indicating whether the trigger is row-level or statement-level.
  • TG_RELID: The object ID of the table on which the trigger is being fired.
  • TG_TABLE_NAME: The name of the table on which the trigger is being fired.
  • TG_TABLE_SCHEMA: The schema of the table on which the trigger is being fired.
  • TG_ARGV: An array of string arguments provided when creating the trigger.
  • TG_NARGS: The number of arguments in the TG_ARGV array.

Types of triggers

There are two types of trigger, BEFORE and AFTER:

Trigger before changes are made

Executes before the triggering event.


_10
create trigger before_insert_trigger
_10
before insert on orders
_10
for each row
_10
execute function before_insert_function();

Trigger after changes are made

Executes after the triggering event.


_10
create trigger after_delete_trigger
_10
after delete on customers
_10
for each row
_10
execute function after_delete_function();

Execution frequency

There are two options available for executing triggers:

  • for each row: specifies that the trigger function should be executed once for each affected row.
  • for each statement: the trigger is executed once for the entire operation (for example, once on insert). This can be more efficient than for each row when dealing with multiple rows affected by a single SQL statement, as they allow you to perform calculations or updates on groups of rows at once.

Dropping a trigger

You can delete a trigger using the drop trigger command:


_10
drop trigger "trigger_name" on "table_name";

Resources