Triggers help automate actions in the database when certain events happen. They make sure important tasks run automatically without needing manual work.
Why triggers are needed in PostgreSQL
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
PostgreSQL
CREATE TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name FOR EACH ROW EXECUTE FUNCTION function_name();
Triggers run automatically when the specified event happens on the table.
You must create a function that the trigger will call.
Examples
PostgreSQL
CREATE TRIGGER update_timestamp BEFORE UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION update_modified_column();
PostgreSQL
CREATE TRIGGER log_delete AFTER DELETE ON orders FOR EACH ROW EXECUTE FUNCTION log_order_deletion();
Sample Program
This example creates a function to update a timestamp column, then a trigger that calls this function before any update on the employees table. When we update an employee's name, the modified_at column updates automatically.
PostgreSQL
CREATE OR REPLACE FUNCTION update_modified_column() RETURNS TRIGGER AS $$ BEGIN NEW.modified_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER update_timestamp BEFORE UPDATE ON employees FOR EACH ROW EXECUTE FUNCTION update_modified_column(); -- Now, when we update an employee, the modified_at column updates automatically. UPDATE employees SET name = 'Alice' WHERE id = 1; SELECT id, name, modified_at FROM employees WHERE id = 1;
Important Notes
Triggers can slow down database operations if overused, so use them only when needed.
Always test triggers carefully to avoid unexpected behavior.
Summary
Triggers automate tasks in the database when data changes.
They help keep data accurate and consistent without manual steps.
Triggers run functions automatically before or after data changes.
Practice
1. Why are triggers needed in a PostgreSQL database?
easy
Solution
Step 1: Understand the purpose of triggers
Triggers run automatically when data changes, so they help automate tasks without manual intervention.Step 2: Compare options to trigger function
Options A, C, and D describe manual updates, file storage, and user management, which are not the main purpose of triggers.Final Answer:
To automatically perform actions when data changes -> Option AQuick Check:
Triggers automate tasks = To automatically perform actions when data changes [OK]
Hint: Triggers run automatically on data changes [OK]
Common Mistakes:
- Thinking triggers are for manual updates
- Confusing triggers with file storage
- Assuming triggers manage user permissions
2. Which of the following is the correct syntax to create a trigger in PostgreSQL?
easy
Solution
Step 1: Review PostgreSQL trigger syntax
The correct syntax uses CREATE TRIGGER, timing (BEFORE/AFTER), event (INSERT/UPDATE/DELETE), table, FOR EACH ROW or STATEMENT, and EXECUTE FUNCTION.Step 2: Check each option for syntax correctness
CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW EXECUTE FUNCTION function_name(); matches the correct syntax exactly. CREATE TRIGGER trigger_name AFTER UPDATE ON table_name CALL function_name(); uses CALL instead of EXECUTE FUNCTION, which is invalid. CREATE TRIGGER trigger_name ON table_name BEFORE DELETE EXECUTE PROCEDURE function_name(); uses EXECUTE PROCEDURE, deprecated in modern PostgreSQL. CREATE TRIGGER trigger_name ON table_name FOR EACH STATEMENT EXECUTE FUNCTION function_name(); places ON table_name before timing and event, which is incorrect order.Final Answer:
CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW EXECUTE FUNCTION function_name(); -> Option AQuick Check:
Correct trigger syntax = CREATE TRIGGER trigger_name BEFORE INSERT ON table_name FOR EACH ROW EXECUTE FUNCTION function_name(); [OK]
Hint: Use EXECUTE FUNCTION, not CALL or PROCEDURE [OK]
Common Mistakes:
- Using CALL instead of EXECUTE FUNCTION
- Using EXECUTE PROCEDURE instead of EXECUTE FUNCTION
- Placing ON table_name in wrong position
3. Given this trigger function and trigger, what will happen when a new row is inserted into
orders table?CREATE FUNCTION check_stock() RETURNS trigger AS $$ BEGIN IF NEW.quantity > stock THEN RAISE EXCEPTION 'Not enough stock'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER stock_check BEFORE INSERT ON orders FOR EACH ROW EXECUTE FUNCTION check_stock();
medium
Solution
Step 1: Analyze the trigger function logic
The function checks if NEW.quantity is greater than stock. If yes, it raises an exception to stop the insert.Step 2: Understand trigger timing and effect
The trigger runs BEFORE INSERT on orders. If exception is raised, insert fails. Otherwise, it returns NEW row to proceed.Final Answer:
The insert will fail if quantity is greater than stock -> Option BQuick Check:
Exception raised on high quantity = The insert will fail if quantity is greater than stock [OK]
Hint: Exception stops insert if condition met [OK]
Common Mistakes:
- Assuming trigger updates stock automatically
- Thinking insert always succeeds
- Believing trigger deletes rows
4. You created this trigger but it does not run when you insert data:
What is the likely problem?
CREATE TRIGGER log_insert AFTER INSERT ON sales EXECUTE FUNCTION log_sale();
What is the likely problem?
medium
Solution
Step 1: Check trigger syntax requirements
PostgreSQL requires FOR EACH ROW or FOR EACH STATEMENT clause in CREATE TRIGGER statement.Step 2: Identify missing clause in given trigger
The trigger lacks FOR EACH ROW or FOR EACH STATEMENT, so it is invalid and will not run.Final Answer:
Missing FOR EACH ROW clause in trigger definition -> Option CQuick Check:
Triggers need FOR EACH ROW/STATEMENT clause [OK]
Hint: Always include FOR EACH ROW or STATEMENT [OK]
Common Mistakes:
- Assuming AFTER INSERT triggers are disallowed
- Thinking function name causes trigger failure
- Believing trigger functions must return void
5. You want to keep a history of changes to the
employees table automatically. Which trigger setup best achieves this?hard
Solution
Step 1: Understand requirement to keep change history
To keep history, old data must be saved before it changes or is deleted.Step 2: Evaluate trigger options for history tracking
Create BEFORE UPDATE trigger that inserts old row into history table uses BEFORE UPDATE trigger to save old row to history table, which is correct. Create AFTER DELETE trigger that updates employees table updates employees after delete, which is unrelated. Create BEFORE INSERT trigger that deletes old rows deletes old rows before insert, losing data. Create AFTER UPDATE trigger that drops employees table drops the table, which is destructive.Final Answer:
Create BEFORE UPDATE trigger that inserts old row into history table -> Option DQuick Check:
Save old data before update = Create BEFORE UPDATE trigger that inserts old row into history table [OK]
Hint: Save old row before update for history [OK]
Common Mistakes:
- Using AFTER DELETE to update main table
- Deleting old rows on insert
- Dropping table by mistake
