Triggers
Triggers
HeliosDB Nano supports PostgreSQL-compatible triggers for automating database operations in response to data changes.
Overview
Triggers are special procedures that automatically execute when specific events (INSERT, UPDATE, DELETE) occur on a table. They are commonly used for:
- Audit logging: Track all changes to sensitive data
- Data validation: Enforce complex business rules
- Automatic updates: Maintain derived columns (timestamps, calculated fields)
- Cascading changes: Propagate updates to related tables
Syntax
CREATE TRIGGER
CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER | INSTEAD OF}{INSERT | UPDATE [OF column_name [, ...]] | DELETE}[OR {INSERT | UPDATE | DELETE} ...]ON table_name[FOR EACH {ROW | STATEMENT}][WHEN (condition)]EXECUTE {FUNCTION | PROCEDURE} function_name()DROP TRIGGER
DROP TRIGGER [IF EXISTS] trigger_name ON table_name [CASCADE | RESTRICT]Trigger Timing
| Timing | Description |
|---|---|
BEFORE | Executes before the triggering operation |
AFTER | Executes after the triggering operation |
INSTEAD OF | Replaces the triggering operation (for views) |
Trigger Events
| Event | Description |
|---|---|
INSERT | Fires when new rows are inserted |
UPDATE | Fires when existing rows are modified |
UPDATE OF column | Fires only when specific columns change |
DELETE | Fires when rows are deleted |
Trigger Granularity
| Type | Description |
|---|---|
FOR EACH ROW | Executes once per affected row |
FOR EACH STATEMENT | Executes once per SQL statement |
Examples
Audit Log Trigger
-- Track all changes to the users tableCREATE TRIGGER audit_insertAFTER INSERT ON usersFOR EACH ROWEXECUTE FUNCTION audit_log();Timestamp Update Trigger
-- Automatically update modified_at columnCREATE TRIGGER update_timestampBEFORE UPDATE ON productsFOR EACH ROWEXECUTE FUNCTION update_modified_at();Column-Specific Trigger
-- Only fire when price or discount changesCREATE TRIGGER track_price_changeAFTER UPDATE OF price, discount ON productsFOR EACH ROWEXECUTE FUNCTION log_price_change();Multi-Event Trigger
-- Single trigger for all DML operationsCREATE TRIGGER multi_eventAFTER INSERT OR UPDATE OR DELETE ON itemsFOR EACH ROWEXECUTE FUNCTION track_changes();Statement-Level Trigger
-- Execute once per bulk operationCREATE TRIGGER bulk_auditAFTER INSERT ON ordersFOR EACH STATEMENTEXECUTE FUNCTION audit_bulk_insert();OR REPLACE Trigger
-- Replace existing trigger definitionCREATE OR REPLACE TRIGGER replace_auditAFTER INSERT ON logsFOR EACH ROWEXECUTE FUNCTION audit_logs();INSTEAD OF Trigger (Views)
-- Intercept delete operations on viewsCREATE TRIGGER prevent_deleteINSTEAD OF DELETE ON user_viewFOR EACH ROWEXECUTE FUNCTION log_delete_attempt();Managing Triggers
View Existing Triggers
-- List all triggers (via system views)SELECT * FROM pg_trigger;Drop a Trigger
-- Remove triggerDROP TRIGGER audit_insert ON users;
-- Safe removal (no error if doesn't exist)DROP TRIGGER IF EXISTS old_trigger ON products;
-- With cascadeDROP TRIGGER legacy_trigger ON orders CASCADE;Current Limitations
The trigger implementation currently supports:
- Full SQL parsing for CREATE TRIGGER and DROP TRIGGER
- All timing options (BEFORE, AFTER, INSTEAD OF)
- All event types (INSERT, UPDATE, DELETE)
- UPDATE OF column specifications
- FOR EACH ROW and FOR EACH STATEMENT
- OR REPLACE clause
- IF EXISTS for DROP TRIGGER
Pending implementation:
- Trigger body execution (stored procedures)
- OLD/NEW row variables
- WHEN clause evaluation
- Trigger function resolution
PostgreSQL Compatibility
HeliosDB Nano trigger syntax is fully compatible with PostgreSQL 17. Triggers created in HeliosDB Nano can be migrated to PostgreSQL without modification.