📚 目录
🛠️ 概述
在 PostgreSQL 中,触发器(Triggers) 是一种自动执行的数据库对象,它在指定的数据库事件发生时被自动调用。触发器通常用于实现自动化操作,例如数据验证、日志记录、自动更新字段等。当对表或视图进行操作时,触发器可以在操作前、操作后、操作过程中自动执行。
📝 触发器的基本概念
触发器由两部分组成:
- 触发器事件:指定了触发器的触发条件,如
INSERT
、UPDATE
、DELETE
等。 - 触发器函数:触发器执行时调用的函数。触发器函数包含了具体的操作逻辑。
触发器可以被设置为在以下时机触发:
- 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
:触发器事件,例如INSERT
、UPDATE
、DELETE
。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
触发器:在执行INSERT
、UPDATE
或DELETE
操作之前触发。常用于数据验证或修改数据。AFTER
触发器:在执行操作之后触发,适用于日志记录、数据同步等。INSTEAD OF
触发器:仅适用于视图,允许在对视图执行INSERT
、UPDATE
或DELETE
操作时代替原操作执行。
示例(AFTER
触发器记录日志):
CREATE TRIGGER after_employee_update
AFTER UPDATE
ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_update();
此触发器会在 employees
表的数据更新后执行 log_employee_update()
函数。
📝 触发器函数
触发器函数是触发器执行时调用的函数。它可以执行任何有效的 SQL 语句。触发器函数必须返回 TRIGGER
类型的值,并且可以访问 NEW
和 OLD
关键字,分别表示触发器事件中的新值和旧值。
示例(触发器函数的创建):
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
值。
📝 触发器的应用场景
触发器在实际应用中有广泛的使用场景,包括但不限于:
- 数据验证:使用
BEFORE
触发器在数据插入或更新之前进行数据验证。 - 自动化更新:在
AFTER
触发器中自动更新相关表的字段,例如更新时间戳。 - 日志记录:自动记录对表的数据修改操作,创建审计日志。
- 实现复合逻辑:在触发器中实现复杂的业务逻辑,如跨表数据同步、通知等。
示例(自动更新时间戳):
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
字段。
📘 参考资料
- PostgreSQL 官方文档:Triggers
- 更多 PostgreSQL 技巧整理自:www.52kanjuqing.com
发表回复