Skip to main content
Documents
Basic SyntaxMath FunctionsDate FunctionsJSON FunctionsDatabasesTables & Schema ManagementString FunctionsTriggersIndexes

PostgreSQL Debugging

PostgreSQL triggers are database callback functions that automatically execute or "trigger" when a specified database event occurs, like an `INSERT`, `UPDATE`, `DELETE`, or `TRUNCATE`. These are used to maintain data integrity, enforce business rules, or perform logging and auditing.

Usage

Triggers are used when you need to automate tasks in response to changes in a table's data. They are particularly useful for maintaining consistency and implementing complex business logic at the database level.

sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE | TRUNCATE }
ON table_name
[ FOR EACH ROW | FOR EACH STATEMENT ]
EXECUTE PROCEDURE function_name();

In this syntax, `CREATE TRIGGER` defines a new trigger named `trigger_name`, specifying when it should fire (`BEFORE`, `AFTER`, or `INSTEAD OF`), which event should trigger it (`INSERT`, `UPDATE`, `DELETE`, or `TRUNCATE`), and the table it applies to (`ON table_name`). `EXECUTE PROCEDURE` calls the function that contains trigger logic.

Examples

1. Basic Trigger on Insert

sql
CREATE OR REPLACE FUNCTION log_insert()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO log_table(action, timestamp) VALUES ('INSERT', NOW());
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_trigger
AFTER INSERT ON main_table
FOR EACH ROW
EXECUTE PROCEDURE log_insert();

This example creates a trigger that logs an entry into `log_table` every time a new row is inserted into `main_table`.

2. Trigger to Enforce Business Rule

sql
CREATE OR REPLACE FUNCTION check_salary()
RETURNS TRIGGER AS $$
BEGIN
  IF NEW.salary < 1000 THEN
    RAISE EXCEPTION 'Salary cannot be less than 1000';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER salary_check
BEFORE INSERT OR UPDATE ON employees
FOR EACH ROW
EXECUTE PROCEDURE check_salary();

Here, a trigger ensures that the salary of any employee is not set below 1000, either on insertion or update.

3. Trigger for Audit Logging

sql
CREATE OR REPLACE FUNCTION audit_changes()
RETURNS TRIGGER AS $$
BEGIN
  IF TG_OP = 'UPDATE' THEN
    INSERT INTO audit_log(table_name, operation, old_data, new_data, changed_at)
    VALUES (TG_TABLE_NAME, TG_OP, ROW(OLD.*), ROW(NEW.*), NOW());
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER audit_trigger
AFTER UPDATE ON any_table
FOR EACH ROW
EXECUTE PROCEDURE audit_changes();

This example captures changes in `any_table` by logging both the old and new row data to an `audit_log` table after each update.

Managing Triggers

To disable a trigger:

sql
ALTER TABLE table_name DISABLE TRIGGER trigger_name;

To enable a trigger:

sql
ALTER TABLE table_name ENABLE TRIGGER trigger_name;

To delete a trigger:

sql
DROP TRIGGER trigger_name ON table_name;

Tips and Best Practices

  • Keep triggers simple and efficient. Complex logic can slow down database operations. Be cautious of performance implications, especially in highly transactional environments.
  • Use triggers for critical constraints. Ensure that critical business rules are enforced at the database level.
  • Limit side effects. Triggers should avoid altering the database state in unexpected ways.
  • Document triggers. Maintain clear documentation for each trigger to help future developers understand its purpose.
  • Test thoroughly. Ensure triggers work as expected by testing with various scenarios and edge cases.
  • Be mindful of execution order. Understand the execution order when multiple triggers are defined for the same event on a table.
  • Handle recursive calls. Be aware of potential recursive trigger calls and implement safeguards where necessary.