Trigger for audit logging in SQL - Time & Space Complexity
We want to understand how the time needed to run a trigger for audit logging changes as the amount of data grows.
Specifically, how does the trigger's work increase when many rows are inserted or updated?
Analyze the time complexity of the following SQL trigger code.
CREATE TRIGGER audit_log_trigger
AFTER INSERT OR UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_log (employee_id, action, action_time)
VALUES (NEW.id, CASE WHEN INSERTING THEN 'INSERT' ELSE 'UPDATE' END, CURRENT_TIMESTAMP);
END;
This trigger records an audit entry every time a row in the employees table is inserted or updated.
Look at what repeats when the trigger runs.
- Primary operation: The trigger runs once for each row inserted or updated.
- How many times: It runs exactly as many times as there are rows changed in the employees table.
As the number of rows changed grows, the trigger runs more times.
| Input Size (rows changed) | Approx. Trigger Runs |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The number of trigger executions grows directly with the number of rows changed.
Time Complexity: O(n)
This means the time to complete audit logging grows linearly with the number of rows inserted or updated.
[X] Wrong: "The trigger runs only once no matter how many rows change."
[OK] Correct: The trigger is defined FOR EACH ROW, so it runs once per changed row, not just once per statement.
Understanding how triggers scale with data changes helps you design efficient audit systems and shows you can think about performance in real database tasks.
"What if the trigger was defined FOR EACH STATEMENT instead of FOR EACH ROW? How would the time complexity change?"
Practice
Solution
Step 1: Understand what audit logging means
Audit logging means keeping a record of changes made to data, such as who changed it and when.Step 2: Identify the role of triggers in audit logging
Triggers automatically run when data changes and can insert records into an audit table to log these changes.Final Answer:
To automatically record changes made to data in a table -> Option AQuick Check:
Audit logging = record data changes automatically [OK]
- Thinking triggers speed up queries
- Confusing audit logging with backups
- Believing triggers manage user permissions
employees?Solution
Step 1: Identify correct trigger timing and event
The question asks for a trigger after INSERT, so it must say AFTER INSERT.Step 2: Check syntax correctness
CREATE TRIGGER trg AFTER INSERT ON employees FOR EACH ROW BEGIN ... END; uses correct syntax: CREATE TRIGGER name AFTER INSERT ON table FOR EACH ROW BEGIN ... END;Final Answer:
CREATE TRIGGER trg AFTER INSERT ON employees FOR EACH ROW BEGIN ... END; -> Option AQuick Check:
Trigger syntax = CREATE TRIGGER ... AFTER INSERT ON ... [OK]
- Using BEFORE UPDATE instead of AFTER INSERT
- Omitting FOR EACH ROW clause
- Wrong trigger event like DELETE instead of INSERT
CREATE TRIGGER audit_update AFTER UPDATE ON products FOR EACH ROW BEGIN INSERT INTO audit_log (product_id, old_price, new_price) VALUES (OLD.id, OLD.price, NEW.price); END;
What will be inserted into
audit_log when a product's price changes from 100 to 120?Solution
Step 1: Understand OLD and NEW in triggers
OLD refers to the row before update, NEW refers to the row after update.Step 2: Analyze the insert statement
The trigger inserts OLD.id, OLD.price, and NEW.price, so product_id is the old id, old_price is 100, new_price is 120.Final Answer:
(product_id: product's id, old_price: 100, new_price: 120) -> Option DQuick Check:
OLD = before update, NEW = after update [OK]
- Mixing OLD and NEW values
- Assuming NULL values for unchanged columns
- Confusing product_id with price values
CREATE TRIGGER log_delete AFTER DELETE ON orders FOR EACH ROW BEGIN INSERT INTO audit_orders (order_id, deleted_at) VALUES (NEW.id, NOW()); END;
Why does this trigger cause an error?
Solution
Step 1: Recall OLD and NEW usage in triggers
In DELETE triggers, only OLD is available because the row is removed; NEW does not exist.Step 2: Identify the error cause
The trigger uses NEW.id in a DELETE trigger, which causes an error because NEW is undefined.Final Answer:
Using NEW keyword in a DELETE trigger causes an error -> Option BQuick Check:
DELETE triggers use OLD, not NEW [OK]
- Using NEW instead of OLD in DELETE triggers
- Confusing FOR EACH ROW and FOR EACH STATEMENT
- Thinking NOW() is disallowed in triggers
customers table into customer_audit. Which approach correctly handles both actions in one trigger?Solution
Step 1: Understand trigger event options
Some SQL systems allow triggers on multiple events like AFTER INSERT OR UPDATE.Step 2: Use conditional logic inside trigger
Inside the trigger, check if the event is INSERT or UPDATE to log accordingly.Step 3: Compare options
Create one trigger AFTER INSERT OR UPDATE and use conditional logic inside correctly combines both events in one trigger with logic; Create two separate triggers: one AFTER INSERT and one AFTER UPDATE uses two triggers, which is valid but not one trigger.Final Answer:
Create one trigger AFTER INSERT OR UPDATE and use conditional logic inside -> Option CQuick Check:
One trigger can handle multiple events with conditions [OK]
- Trying to log UPDATE in an INSERT-only trigger
- Using BEFORE DELETE for INSERT/UPDATE logging
- Not using conditional logic inside multi-event triggers
Ready to prove it?
Pass the test and this pattern moves unknown
