📚 目录

  1. 概述
  2. 触发器的基本概念
  3. 创建触发器
  4. 触发器的类型
  5. 触发器函数
  6. 触发器的应用场景
  7. 参考资料

🛠️ 概述

在 PostgreSQL 中,触发器(Triggers) 是一种自动执行的数据库对象,它在指定的数据库事件发生时被自动调用。触发器通常用于实现自动化操作,例如数据验证、日志记录、自动更新字段等。当对表或视图进行操作时,触发器可以在操作前、操作后、操作过程中自动执行。


📝 触发器的基本概念

触发器由两部分组成:

  1. 触发器事件:指定了触发器的触发条件,如 INSERTUPDATEDELETE 等。
  2. 触发器函数:触发器执行时调用的函数。触发器函数包含了具体的操作逻辑。

触发器可以被设置为在以下时机触发:

  • BEFORE:在数据操作之前触发。
  • AFTER:在数据操作之后触发。
  • INSTEAD OF:在对视图执行操作时,代替原操作执行。

📝 创建触发器

创建触发器首先需要定义一个触发器函数,然后再通过 CREATE TRIGGER 语句将触发器与事件绑定。

语法:

CREATE TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF } event
ON table_name
[ FOR EACH ROW | FOR EACH STATEMENT ]
[ WHEN (condition) ]
EXECUTE FUNCTION function_name();

  • trigger_name:触发器的名称。
  • event:触发器事件,例如 INSERTUPDATEDELETE
  • table_name:触发器关联的表。
  • WHEN (condition):可选条件,指定触发器的触发条件。
  • function_name():触发器函数的名称。

示例(创建一个在 INSERT 时触发的触发器):

CREATE TRIGGER log_insert
AFTER INSERT
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_insert();

该触发器将在 employees 表中插入数据后触发,并执行名为 log_employee_insert() 的触发器函数。


📝 触发器的类型

PostgreSQL 支持以下几种类型的触发器:

  • BEFORE 触发器:在执行 INSERTUPDATEDELETE 操作之前触发。常用于数据验证或修改数据。
  • AFTER 触发器:在执行操作之后触发,适用于日志记录、数据同步等。
  • INSTEAD OF 触发器:仅适用于视图,允许在对视图执行 INSERTUPDATEDELETE 操作时代替原操作执行。

示例(AFTER 触发器记录日志):

CREATE TRIGGER after_employee_update
AFTER UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_update();

此触发器会在 employees 表的数据更新后执行 log_employee_update() 函数。


📝 触发器函数

触发器函数是触发器执行时调用的函数。它可以执行任何有效的 SQL 语句。触发器函数必须返回 TRIGGER 类型的值,并且可以访问 NEWOLD 关键字,分别表示触发器事件中的新值和旧值。

示例(触发器函数的创建):

CREATE OR REPLACE FUNCTION log_employee_insert() 
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO employee_log (employee_id, action, action_time)
  VALUES (NEW.id, 'INSERT', CURRENT_TIMESTAMP);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

在这个示例中,log_employee_insert() 函数会在每次插入新员工时将日志记录到 employee_log 表中。NEW.id 代表新插入的记录的 id 值。


📝 触发器的应用场景

触发器在实际应用中有广泛的使用场景,包括但不限于:

  1. 数据验证:使用 BEFORE 触发器在数据插入或更新之前进行数据验证。
  2. 自动化更新:在 AFTER 触发器中自动更新相关表的字段,例如更新时间戳。
  3. 日志记录:自动记录对表的数据修改操作,创建审计日志。
  4. 实现复合逻辑:在触发器中实现复杂的业务逻辑,如跨表数据同步、通知等。

示例(自动更新时间戳):

CREATE OR REPLACE FUNCTION update_timestamp() 
RETURNS TRIGGER AS $$
BEGIN
  NEW.updated_at := CURRENT_TIMESTAMP;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_employee_timestamp
BEFORE UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION update_timestamp();

在这个示例中,update_employee_timestamp 触发器会在每次更新 employees 表的数据时自动更新 updated_at 字段。


📘 参考资料