INSTEAD OF trigger for views in PostgreSQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using INSTEAD OF triggers on views, it is important to understand how the time to process changes as the data grows.
We want to know how the trigger's execution time scales when many rows are affected.
Analyze the time complexity of this INSTEAD OF trigger on a view.
CREATE VIEW employee_view AS
SELECT id, name, salary FROM employees;
CREATE FUNCTION employee_view_insert() RETURNS trigger AS $$
BEGIN
INSERT INTO employees (id, name, salary) VALUES (NEW.id, NEW.name, NEW.salary);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER insert_employee_instead
INSTEAD OF INSERT ON employee_view
FOR EACH ROW EXECUTE FUNCTION employee_view_insert();
This code creates a view and an INSTEAD OF trigger that inserts rows into the base table when the view is inserted into.
Look at what repeats when inserting multiple rows through the view.
- Primary operation: The trigger function runs once for each inserted row.
- How many times: Equal to the number of rows inserted into the view.
As you insert more rows through the view, the trigger runs once per row.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 trigger executions |
| 100 | 100 trigger executions |
| 1000 | 1000 trigger executions |
Pattern observation: The work grows directly with the number of rows inserted.
Time Complexity: O(n)
This means the time to insert rows through the view grows linearly with the number of rows.
[X] Wrong: "The trigger runs only once no matter how many rows are inserted."
[OK] Correct: The trigger is defined FOR EACH ROW, so it runs once per row, not once per statement.
Understanding how triggers scale helps you design efficient database operations and explain performance in real projects.
What if the trigger was defined FOR EACH STATEMENT instead of FOR EACH ROW? How would the time complexity change?
Practice
INSTEAD OF trigger on a view in PostgreSQL?Solution
Step 1: Understand what views normally do
Views in PostgreSQL are virtual tables that do not store data themselves and usually cannot be directly updated.Step 2: Role of INSTEAD OF triggers
INSTEAD OF triggers let you define custom actions that run instead of the usual insert, update, or delete on the view, making it updatable.Final Answer:
To run custom code instead of the default insert, update, or delete on the view -> Option BQuick Check:
INSTEAD OF triggers = custom code on views [OK]
- Thinking INSTEAD OF triggers speed up queries
- Confusing INSTEAD OF triggers with indexes
- Believing INSTEAD OF triggers block all changes
my_view for INSERT operations?Solution
Step 1: Recall correct trigger syntax in PostgreSQL
The syntax requires specifying the trigger name, the event timing (INSTEAD OF), the event type (INSERT), the target (ON my_view), and the function to execute.Step 2: Identify the full correct syntax
CREATE TRIGGER trg_instead_of_insert ON my_view INSTEAD OF INSERT FOR EACH ROW EXECUTE FUNCTION trg_func(); correctly includes "ON my_view INSTEAD OF INSERT FOR EACH ROW EXECUTE FUNCTION trg_func();" which is the proper syntax for INSTEAD OF triggers on views.Final Answer:
CREATE TRIGGER trg_instead_of_insert ON my_view INSTEAD OF INSERT FOR EACH ROW EXECUTE FUNCTION trg_func(); -> Option AQuick Check:
INSTEAD OF triggers need FOR EACH ROW and correct order [OK]
- Placing INSTEAD OF before ON
- Omitting FOR EACH ROW
- Using BEFORE instead of INSTEAD OF
CREATE VIEW emp_view AS SELECT id, name FROM employees; CREATE FUNCTION emp_view_insert() RETURNS trigger AS $$ BEGIN INSERT INTO employees(id, name) VALUES (NEW.id, NEW.name); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_emp_insert INSTEAD OF INSERT ON emp_view FOR EACH ROW EXECUTE FUNCTION emp_view_insert(); INSERT INTO emp_view (id, name) VALUES (1, 'Alice'); SELECT * FROM employees WHERE id = 1;
What will the SELECT query return?
Solution
Step 1: Understand the INSTEAD OF trigger effect
The trigger function inserts the new row into the base table employees when an insert is done on the view emp_view.Step 2: Trace the INSERT and SELECT
The INSERT INTO emp_view triggers emp_view_insert(), which inserts (1, 'Alice') into employees. The SELECT then finds this row.Final Answer:
(1, 'Alice') -> Option DQuick Check:
INSTEAD OF trigger inserts row into employees [OK]
- Assuming views cannot be inserted into
- Expecting syntax error on insert
- Forgetting trigger function inserts data
CREATE FUNCTION trg_update() RETURNS trigger AS $$ BEGIN UPDATE employees SET name = NEW.name WHERE id = NEW.id; END; $$ LANGUAGE plpgsql;
When you try to update the view, you get an error. What is the problem?
Solution
Step 1: Check trigger function requirements
Trigger functions must return a value, usually NEW or OLD, depending on the trigger type.Step 2: Identify missing RETURN statement
The function lacks a RETURN statement, causing an error when the trigger tries to get a result.Final Answer:
The function does not return a value -> Option AQuick Check:
Trigger functions must return NEW or OLD [OK]
- Omitting RETURN in trigger functions
- Confusing INSTEAD OF with BEFORE triggers
- Assuming plpgsql is not allowed
products(id, name, price) that only allows updating the price through the view. Which approach using an INSTEAD OF trigger is correct?Solution
Step 1: Understand the goal
The view should allow updating only the price column, so the trigger must update only that column in the base table.Step 2: Choose the correct trigger approach
INSTEAD OF UPDATE triggers on views let you control exactly what updates happen. Updating only price and returning NEW is correct.Final Answer:
Create an INSTEAD OF UPDATE trigger that updates only the price column in products and returns NEW -> Option CQuick Check:
INSTEAD OF triggers control updates precisely [OK]
- Updating all columns ignoring restrictions
- Using BEFORE triggers on views (not supported)
- Using rules instead of triggers for complex logic
