0Pricing
SQL Academy · 课时

触发器剖析: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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 触发器剖析:BEFORE/AFTER、FOR EACH ROW
  2. PL/pgSQL 函数基础
  3. DO 块与匿名代码
  4. 使用触发器审计表
← 返回 SQL Academy