SQL

An SQL trigger is a database object that automatically executes a predefined action in response to specific events on a table or view. You can use triggers to enforce business rules, validate data, or automatically maintain related tables.

How to Use SQL Triggers

SQL triggers execute when a specified event occurs, such as an INSERT, UPDATE, or DELETE operation. They are associated with a table and fire before or after the triggering event.

Basic Syntax

CREATE TRIGGER trigger_name
AFTER INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
BEGIN
    -- Trigger logic
END;
  • CREATE TRIGGER trigger_name: Defines the trigger name.
  • AFTER INSERT | UPDATE | DELETE: Specifies the event that activates the trigger.
  • ON table_name: Associates the trigger with a specific table.
  • FOR EACH ROW: Ensures the trigger executes once for each affected row.
  • BEGIN ... END: Contains the trigger’s logic.

Example: Auditing Changes

To track salary updates in an employee table, you can create a trigger that logs changes into an audit table:

CREATE TRIGGER log_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO salary_audit (employee_id, old_salary, new_salary, change_date)
    VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END;

This captures salary changes, storing the previous and new values along with a timestamp.


When to Use SQL Triggers

SQL triggers automate processes, enforce constraints, and maintain data consistency. Here are some common scenarios where triggers are useful.

Enforcing Business Rules

Triggers help enforce rules at the database level. For example, you can prevent salary reductions by rejecting updates that decrease the salary.

CREATE TRIGGER prevent_salary_cut
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary < OLD.salary THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Salary reduction is not allowed';
    END IF;
END;

This stops any attempt to lower an employee’s salary.

Automating Data Synchronization

When you need to maintain consistency between tables, triggers can update related data automatically. For example, if an order is deleted, the associated records in the payments table should also be removed.

CREATE TRIGGER delete_order_payments
AFTER DELETE ON orders
FOR EACH ROW
BEGIN
    DELETE FROM payments WHERE order_id = OLD.order_id;
END;

This removes orphaned payment records when an order is deleted.

Logging Data Changes

You can track user modifications by creating an audit log. For example, log every deletion from the customers table.

CREATE TRIGGER log_customer_deletions
AFTER DELETE ON customers
FOR EACH ROW
BEGIN
    INSERT INTO customer_audit (customer_id, deleted_at)
    VALUES (OLD.customer_id, NOW());
END;

This ensures deleted records are recorded for compliance or recovery purposes.


Examples of SQL Triggers

Automatically Updating a Timestamp

When an employee’s record is updated, you might want to track when the update happened.

CREATE TRIGGER update_last_modified
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
    SET NEW.last_modified = NOW();
END;

This trigger sets the last_modified column to the current timestamp whenever a row is updated.

Preventing Deletions from a Critical Table

To prevent accidental deletions from an important table, you can use a trigger that rejects DELETE statements.

CREATE TRIGGER prevent_employee_deletion
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Deleting employees is not allowed';
END;

Any attempt to delete an employee record will result in an error.

Calculating Derived Values

Suppose you have an orders table, and you want to ensure the total price is always calculated automatically.

CREATE TRIGGER calculate_order_total
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
    SET NEW.total_price = NEW.unit_price * NEW.quantity;
END;

This trigger ensures that the total_price column always reflects the correct amount.


Learn More About SQL Triggers

Types of SQL Triggers

Triggers vary based on when and how they execute.

  • BEFORE Triggers: Fire before the triggering action (useful for validation or modifications).
  • AFTER Triggers: Execute after the triggering action (useful for logging and auditing).
  • INSTEAD OF Triggers: Used on views to override default behavior.
  • Row-Level vs. Statement-Level Triggers: Row-level triggers fire for each affected row, while statement-level triggers execute once per SQL statement.

Disabling and Dropping SQL Triggers

If you need to temporarily disable a trigger, you can do so without dropping it.

ALTER TABLE employees DISABLE TRIGGER prevent_employee_deletion;

To remove a trigger permanently:

DROP TRIGGER prevent_employee_deletion;

Common Pitfalls of SQL Triggers

While triggers are powerful, they can introduce performance overhead and complexity.

  • Hidden Logic: Because triggers run automatically, they can cause unexpected side effects.
  • Performance Issues: Triggers execute for each affected row, which can slow down bulk operations.
  • Debugging Challenges: Since triggers operate in the background, diagnosing issues can be tricky.

Advanced Use Cases

  • Cascading Triggers: One trigger activates another, creating a chain of automatic actions.
  • Dynamic Triggers: Some databases allow triggers that adapt their behavior based on conditions.
  • Triggers for Data Integrity: Prevents invalid data entry, such as ensuring email addresses follow a format.
Learn SQL for Free
Start learning now
button icon
To advance beyond this tutorial and learn SQL by doing, try the interactive experience of Mimo. Whether you're starting from scratch or brushing up your coding skills, Mimo helps you take your coding journey above and beyond.

Sign up or download Mimo from the App Store or Google Play to enhance your programming skills and prepare for a career in tech.

You can code, too.

© 2025 Mimo GmbH