🐘 PostgreSQL - Triggers
Updated at 2015-11-19 08:32
Trigger functions can be written in most available procedural languages e.g. PL/pgSQL, PL/Tcl, PL/Python like other PostgreSQL functions.
Trigger functions must be defined before the trigger itself can be created. It must be declared as a function taking no arguments and returning type trigger
.
Trigger is the binding between function call and an event. Trigger is a specification that database should automatically execute a particular function whenever certain type of operation is performed.
-- Creating the function we are going to call.
-- DROP FUNCTION trigger_refresh_updated_at();
CREATE OR REPLACE FUNCTION trigger_refresh_updated_at()
RETURNS trigger
LANGUAGE plpgsql AS
$$
BEGIN
NEW.updated_at := clock_timestamp();
RETURN NEW;
END;
$$;
-- Defining that the function should be called after updates.
-- DROP TRIGGER users_after_update ON users;
CREATE TRIGGER users_after_update
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE trigger_refresh_updated_at();
SELECT * FROM users;
UPDATE users SET name = 'Jane Doe' WHERE name = 'John Doe';
SELECT * FROM users;
-- You can see that the `updated_at` has changed
Note that a single trigger function can be used in multiple triggers.
CREATE TRIGGER table_name_before_all
BEFORE
UPDATE OR DELETE
ON users
FOR EACH ROW EXECUTE PROCEDURE trigger_refresh_updated_at();
CREATE TRIGGER table_name_after_all
AFTER
INSERT OR UPDATE
ON users
FOR EACH ROW EXECUTE PROCEDURE trigger_refresh_updated_at();
Triggers can be per-row or per-statement:
- Per-row means that trigger function is invoked once for each row.
- Per-statement means that trigger functions is invoked for each statement.
Triggers are BEFORE
or AFTER
:
- Before triggers are invoked before triggering operation takes place.
- After triggers are invoked after triggering operation has taken place.
Sources
- Postgres Guide
- PostgreSQL documentation