SQL Practice Logo

SQLPractice Online

Triggers & Stored Procedures: Examples

Module: Schema Design & Advanced DDL

Audit Logging Trigger

intermediate

Track all changes to orders table for compliance. Log old values, new values, who changed it, when.

CREATE TABLE audit_log (

audit_id SERIAL PRIMARY KEY,

table_name VARCHAR(50),

record_id INT,

action VARCHAR(10),

old_data JSONB,

new_data JSONB,

changed_by VARCHAR(100),

changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

CREATE FUNCTION log_order_changes() RETURNS TRIGGER AS $$

BEGIN

INSERT INTO audit_log (table_name, record_id, action, old_data, new_data, changed_by)

VALUES (

'orders',

COALESCE(NEW.order_id, OLD.order_id),

TG_OP,

CASE WHEN TG_OP != 'INSERT' THEN row_to_json(OLD) ELSE NULL END,

CASE WHEN TG_OP != 'DELETE' THEN row_to_json(NEW) ELSE NULL END,

current_user

);

RETURN NEW;

END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER audit_orders

AFTER INSERT OR UPDATE OR DELETE ON orders

FOR EACH ROW

EXECUTE FUNCTION log_order_changes();

All changes logged automatically with before/after data

Trigger fires on every change. Logs complete history. Critical for compliance. Cannot be bypassed.

PostgreSQL

sequenceDiagram

participant App

participant Orders

participant Trigger

participant AuditLog

App->>Orders: INSERT order