Lab 04: Triggers & Events

Time: 40 minutes | Level: Practitioner | DB: MySQL 8.0 + PostgreSQL 15

Triggers are database callbacks that fire automatically on INSERT, UPDATE, or DELETE. Events (MySQL) and pg_cron (PostgreSQL) schedule periodic tasks without external cron jobs.


Step 1 — Setup: Orders and Audit Table

MySQL:

USE labdb;

CREATE TABLE IF NOT EXISTS audit_log (
  id          INT AUTO_INCREMENT PRIMARY KEY,
  table_name  VARCHAR(50),
  action      VARCHAR(20),
  record_id   INT,
  changed_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  details     TEXT
);

PostgreSQL:

CREATE TABLE audit_log (
  id         SERIAL PRIMARY KEY,
  table_name TEXT,
  action     TEXT,
  record_id  INT,
  old_data   JSONB,
  new_data   JSONB,
  changed_at TIMESTAMP DEFAULT NOW()
);

Step 2 — MySQL: AFTER INSERT Trigger

📸 Verified Output:

💡 NEW.column refers to the incoming row in INSERT/UPDATE triggers. OLD.column refers to the row being replaced or deleted.


Step 3 — MySQL: BEFORE UPDATE Trigger

💡 BEFORE triggers can modify NEW values before the row is written. AFTER triggers fire after the row is written and cannot change it.


Step 4 — MySQL: AFTER DELETE Trigger + Soft Delete


Step 5 — MySQL: Event Scheduler

💡 The MySQL Event Scheduler is equivalent to cron for database tasks — no external scheduler needed. Check SELECT @@event_scheduler; to confirm it's ON.


Step 6 — PostgreSQL: Trigger Function + CREATE TRIGGER

💡 PostgreSQL separates the trigger function (logic) from the trigger (attachment). One function can be reused across multiple tables.


Step 7 — PostgreSQL: Test Trigger and INSTEAD OF on Views

📸 Verified Output:


Step 8 — Capstone: Inventory Trigger System

Build a trigger that automatically decrements stock when an order is placed:


Summary

Concept
MySQL
PostgreSQL

Trigger timing

BEFORE / AFTER

BEFORE / AFTER / INSTEAD OF

Trigger events

INSERT / UPDATE / DELETE

INSERT / UPDATE / DELETE / TRUNCATE

Row reference

NEW, OLD

NEW, OLD

Modify before write

BEFORE + SET NEW.col

BEFORE + NEW.col := val

Raise error

SIGNAL SQLSTATE '45000'

RAISE EXCEPTION '...'

Scheduling

CREATE EVENT ... ON SCHEDULE

pg_cron extension

View triggers

Not supported

INSTEAD OF on views

Last updated