Summary: in this tutorial, you will learn how to define a PostgreSQL BEFORE TRUNCATE
trigger that fires before a TRUNCATE
event occurs on a table.
Introduction to the PostgreSQL BEFORE TRUNCATE trigger
A TRUNCATE TABLE
statement removes all from a table without creating any logs, making it faster than a DELETE
operation.
PostgreSQL allows you to create a trigger that fires before a TRUNCATE
event occurs.
A BEFORE TRUNCATE
trigger is a statement-level trigger because the TRUNCATE
statement deletes all the rows from the table, not individual rows.
Although the TRUNCATE
operation deletes rows from a table, it does not activate the DELETE
trigger including BEFORE
and AFTER DELETE
triggers.
Here’s the step for creating a BEFORE TRUNCATE
trigger:
First, define a user-defined function that will execute before the TRUNCATE
event:
CREATE OR REPLACE FUNCTION trigger_function_name() RETURNS TRIGGER AS $$ BEGIN -- This logic will be executed before the TRUNCATE operation -- ... RETURN NULL; END; $$ LANGUAGE plpgsql;
The function returns NULL
indicating that the trigger doesn’t return additional output.
Second, create a BEFORE TRUNCATE
trigger and associate the function with it:
CREATE TRIGGER trigger_name BEFORE TRUNCATE ON table_name FOR EACH STATEMENT EXECUTE FUNCTION trigger_function_name();
Since the BEFORE TRUNCATE
trigger is a statement-level trigger, you need to specify the FOR EACH STATEMENT
clause in the CREATE TRIGGER
statement.
Unlike INSERT
, UPDATE
, or DELETE
, which support BEFORE
and AFTER
trigger types, TRUNCATE
only supports BEFORE
triggers.
PostgreSQL BEFORE TRUNCATE trigger example
We’ll create a BEFORE TRUNCATE
trigger to prevent applications from truncating a table.
First, create a new table called companies
to store company data:
CREATE TABLE companies( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL );
Second, insert some rows into the companies
table:
INSERT INTO companies(name) VALUES ('Apple'), ('Microsoft'), ('Google') RETURNING *;
Output:
id | name ----+----------- 1 | Apple 2 | Microsoft 3 | Google (3 rows)
Third, define a function that will execute when a TRUNCATE
event occurs:
CREATE OR REPLACE FUNCTION before_truncate_companies() RETURNS TRIGGER AS $$ BEGIN RAISE NOTICE 'Truncating the companies table is not allowed'; RETURN NULL; END; $$ LANGUAGE plpgsql;
Fourth, create a trigger that fires before a TRUNCATE
event occurs:
CREATE TRIGGER before_truncate_companies_trigger BEFORE TRUNCATE ON companies FOR EACH STATEMENT EXECUTE FUNCTION before_truncate_companies();
Fifth, attempt to truncate the companies
table:
TRUNCATE TABLE companies;
Output:
NOTICE: Truncating the companies table is not allowed TRUNCATE TABLE
The output indicates that the BEFORE TRUNCATE
trigger fires, raising an exception that aborts the TRUNCATE
operation.
Summary
- A
BEFORE TRUNCATE
trigger is a statement-level trigger. - Create a
BEFORE TRUNCATE
trigger to fire before aTRUNCATE
event.