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

PostgreSQL Performance Considerations

Triggers in PostgreSQL are database callback functions automatically invoked or executed in response to certain events on a particular table or view. They are used to enforce business rules, validate input data, and maintain data integrity.

Usage

Triggers are employed when you need to automatically execute a function in response to events such as `INSERT`, `UPDATE`, or `DELETE` operations on a table. They are defined to act before or after these events.

sql
CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE function_name(arguments);

In this syntax, `CREATE TRIGGER` sets up a trigger called `trigger_name` that executes `function_name` when specified events occur on `table_name`.

Examples

1. Basic Insert Trigger

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

CREATE TRIGGER insert_audit
AFTER INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE log_insert();

This trigger logs every insert operation on `my_table` by adding a record to `audit_table`.

2. Update Trigger with Conditional Logic

sql
CREATE OR REPLACE FUNCTION check_update()
RETURNS TRIGGER AS $$
BEGIN
  IF NEW.amount < 0 THEN
    RAISE EXCEPTION 'Amount cannot be negative';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER check_update_trigger
BEFORE UPDATE ON transactions
FOR EACH ROW EXECUTE PROCEDURE check_update();

This trigger verifies that the `amount` column in the `transactions` table is not negative before update operations.

3. Trigger for Cascading Deletes

sql
CREATE OR REPLACE FUNCTION cascade_delete()
RETURNS TRIGGER AS $$
BEGIN
  DELETE FROM child_table WHERE parent_id = OLD.id;
  RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER cascading_delete_trigger
AFTER DELETE ON parent_table
FOR EACH ROW EXECUTE PROCEDURE cascade_delete();

This trigger ensures that when a row is deleted from `parent_table`, related rows in `child_table` are also removed.

Tips and Best Practices

  • Limit trigger logic. Keep trigger functions simple to minimize performance overhead and avoid complex business logic.
  • Use row-level triggers selectively. Opt for statement-level triggers when possible to reduce the number of executions. Row-level triggers are useful when operations need to be performed on each affected row, whereas statement-level triggers can reduce overhead by executing once per operation.
  • Be cautious with recursive triggers. Ensure that triggers do not unintentionally call themselves, leading to infinite loops.
  • Test thoroughly. Extensively test triggers in a development environment to assess their impact on performance.
  • Document triggers. Clearly document the purpose and logic of each trigger for future reference and maintenance.
  • Consider transaction boundaries. Be mindful of transaction boundaries to ensure triggers behave as expected in multi-statement transactions.
  • Monitor performance. Keep an eye on the performance impact of triggers in a live system and diagnose any issues using PostgreSQL's logging and monitoring tools.

Managing Triggers

  • To disable a trigger temporarily, use the `ALTER TABLE ... DISABLE TRIGGER` command.
  • To permanently remove a trigger, use the `DROP TRIGGER` command.