触发器剖析:BEFORE/AFTER、FOR EACH ROW
了解触发器的执行时机和粒度(行级与语句级),以及 NEW 和 OLD 在触发器函数中的含义
触发器剖析:BEFORE/AFTER、FOR EACH ROW 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
什么是触发器
触发器是数据库在表上执行 INSERT、UPDATE、DELETE 或 TRUNCATE 之前或之后自动调用的函数。
两个组成部分:函数与触发器
您编写一个返回 trigger 的函数,然后将其附加到表上:
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_set_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION set_updated_at();BEFORE 与 AFTER
- BEFORE — 在写入行之前触发;可以修改 NEW
- AFTER — 在写入之后触发;用于副作用操作(审计、通知)
FOR EACH ROW 与 FOR EACH STATEMENT
- FOR EACH ROW — 每个受影响的行执行一次;可以使用
NEW和OLD - FOR EACH STATEMENT — 每条语句执行一次,无法访问单独的行
NEW 与 OLD
在行触发器内部:
NEW— 新行(INSERT、UPDATE)OLD— 原来的行(UPDATE、DELETE)
返回值很重要
对于 BEFORE 行触发器:
- 返回
NEW,继续处理该行 - 返回修改后的
NEW,改变实际存储的内容 - 返回
NULL,取消对该行执行的操作
WHEN 过滤条件
有条件地触发:
CREATE TRIGGER trg_log_status
AFTER UPDATE OF status ON orders
FOR EACH ROW WHEN (OLD.status IS DISTINCT FROM NEW.status)
EXECUTE FUNCTION log_status_change();OF 列
BEFORE/AFTER UPDATE 只有在指定列发生变化时才会触发:
CREATE TRIGGER ... AFTER UPDATE OF status ON orders ...多个触发器
触发器会按照触发器名称的字母顺序触发。使用前缀(00_、10_……)控制顺序。
触发器性能
行触发器会对每一行触发——在行触发器中执行复杂逻辑,再乘以大量 DML,速度会很慢。对于批量副作用操作,优先使用语句触发器。
禁用触发器
暂时跳过:
ALTER TABLE orders DISABLE TRIGGER trg_audit;
-- bulk load...
ALTER TABLE orders ENABLE TRIGGER trg_audit;
-- Disable ALL triggers (use carefully):
ALTER TABLE orders DISABLE TRIGGER ALL;触发器递归
对同一张表执行 UPDATE 的触发器会再次触发该触发器。请使用保护条件(pg_trigger_depth())或谨慎设计。
回顾
触发器可以自动执行逐行响应。
- 返回 TRIGGER 的函数 + CREATE TRIGGER
- BEFORE 用于修改,AFTER 用于副作用操作
- 使用 NEW/OLD 访问行
- 使用 WHEN 和 OF 列提高选择性
快速检查
您希望在每次行发生变化时自动更新 updated_at 列。应采用哪种触发器设置?
常见问题解答
「触发器剖析:BEFORE/AFTER、FOR EACH ROW」课时是免费的吗?
是的 — 「触发器剖析:BEFORE/AFTER、FOR EACH ROW」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「触发器剖析:BEFORE/AFTER、FOR EACH ROW」这节课中我会学到什么?
了解触发器的执行时机和粒度(行级与语句级),以及 NEW 和 OLD 在触发器函数中的含义 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「触发器剖析:BEFORE/AFTER、FOR EACH ROW」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 触发器剖析:BEFORE/AFTER、FOR EACH ROW
- PL/pgSQL 函数基础
- DO 块与匿名代码
- 使用触发器审计表