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

PostgreSQL INSTEAD OF triggers

Triggers in PostgreSQL are special procedures that automatically execute in response to certain events on a table or view. The `INSTEAD OF` trigger specifically allows you to define custom behavior for actions like `INSERT`, `UPDATE`, or `DELETE` on views.

Usage

`INSTEAD OF` triggers are used when you need to override the default action on a view, effectively allowing for complex logic or data manipulation that isn't directly supported by standard SQL operations. These triggers are defined to occur `INSTEAD OF` the triggering event. Note that `INSTEAD OF` triggers are only applicable to views and not tables.


CREATE TRIGGER trigger_name
INSTEAD OF {INSERT | UPDATE | DELETE}
ON view_name
FOR EACH ROW
EXECUTE FUNCTION function_name();

In this syntax, `INSTEAD OF` specifies that the trigger will substitute the default operation on the specified view with the logic defined in `function_name`. The `NEW` and `OLD` records within the trigger functions represent the new data for an `INSERT` or `UPDATE`, and the existing data for `UPDATE` or `DELETE`, respectively.

Examples

1. Basic INSTEAD OF INSERT Trigger


CREATE FUNCTION insert_employee()
RETURNS TRIGGER AS $$
BEGIN
    INSERT INTO employees (id, name)
    VALUES (NEW.id, NEW.name);
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER insert_employee_trigger
INSTEAD OF INSERT ON employees_view
FOR EACH ROW
EXECUTE FUNCTION insert_employee();

This example defines an `INSTEAD OF INSERT` trigger that inserts data into the `employees` table when an insert is attempted on `employees_view`.

2. INSTEAD OF UPDATE Trigger


CREATE FUNCTION update_employee_name()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE employees
    SET name = NEW.name
    WHERE id = OLD.id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_employee_trigger
INSTEAD OF UPDATE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION update_employee_name();

This trigger replaces an update on `employees_view` with an update on `employees`, changing the `name` field based on the view's changes.

3. INSTEAD OF DELETE Trigger


CREATE FUNCTION delete_employee()
RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM employees
    WHERE id = OLD.id;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER delete_employee_trigger
INSTEAD OF DELETE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION delete_employee();

The trigger handles deletions on `employees_view` by deleting the corresponding entry in the `employees` table.

Tips and Best Practices

  • Use with views. `INSTEAD OF` triggers are most useful with views, as they allow you to define how operations on a view translate to base tables.
  • Ensure function correctness. The function used in the trigger should handle all possible cases for the operation to avoid unexpected behaviors.
  • Test triggers thoroughly. Since triggers can alter the default behavior, thorough testing is crucial to ensure they perform as expected.
  • Use transactions. Consider using transactions within trigger functions to maintain data integrity, especially when the operation involves multiple steps.
  • Document your triggers. Clear documentation helps maintain code readability and aids other developers in understanding the customized logic.
  • Consider performance implications. Be aware that complex logic in `INSTEAD OF` triggers can lead to performance overhead, so optimize the trigger functions for efficiency.

Additional Considerations

  • Use Cases. `INSTEAD OF` triggers are particularly beneficial for handling complex view logic that cannot be directly expressed in SQL.
  • Version Information. `INSTEAD OF` triggers were introduced in PostgreSQL version 9.1, which is important for compatibility with older systems.