↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4
历史版本PostgreSQL 8.0 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

36.6. PL/Tcl 中的触发器函数 #

可以用 PL/Tcl 编写触发器函数。PostgreSQL 要求作为触发器调用的函数必须声明为无参数、返回类型为 trigger 的函数。

触发器管理器的信息通过下列变量传入过程体:

$TG_name

CREATE TRIGGER 语句中触发器的名称。

$TG_relid

导致触发器过程被调用的表的对象 ID。

$TG_relatts

表列名构成的 Tcl 列表,其前面带有一个空列表元素。因此,使用 Tcl 的 lsearch 命令在该列表中 查找列名时,返回的元素编号会从 1 开始表示第一列,这与 PostgreSQL 中列的惯常编号方式 一致。(空列表元素也会出现在已删除列的位置上,这样其右侧 列的属性编号仍然正确。)

$TG_when

根据触发器事件的类型,为字符串 BEFORE 或 AFTER。

$TG_level

根据触发器事件的类型,为字符串 ROW 或 STATEMENT。

$TG_op

字符串 INSERT、UPDATE 或 DELETE,取决于触发器调用的类型。

$NEW

对于 INSERT 或 UPDATE 动作,这是 一个包含新表行值的关联数组;对于 DELETE 则为空。 该数组以列名为索引。值为空值的列不会出现在数组中。

$OLD

对于 UPDATE 或 DELETE 动作,这是 一个包含旧表行值的关联数组;对于 INSERT 则为空。 该数组以列名为索引。值为空值的列不会出现在数组中。

$args

一个 Tcl 列表,包含 CREATE TRIGGER 语句中给出的过程参数。这些参数也可以在过程体中以 $1 ... $n 的形式访问。

触发器过程的返回值可以是字符串 OK 或 SKIP,也可以是 array get Tcl 命令返回 的列表。如果返回值为 OK,触发该触发的操作 (INSERT/UPDATE/DELETE)将 正常进行。SKIP 告诉触发器管理器静默地取消 针对该行的操作。如果返回的是列表,则告诉 PL/Tcl 向触发器 管理器返回一个修改后的行,用该行代替 $NEW 中给出 的行被插入。(这只对 INSERT 和 UPDATE 有效。)不用说,所有这些只在触发器是 BEFORE 且为 FOR EACH ROW 时才有意义; 否则返回值会被忽略。

下面是一个简单的触发器函数示例,强制用表中的一个整数值记录该行的更新次数。新插入的行将此值初始化为 0,以后每次更新操作都将其递增。

CREATE FUNCTION trigfunc_modcount() RETURNS trigger AS $$
    switch $TG_op {
        INSERT {
            set NEW($1) 0
        }
        UPDATE {
            set NEW($1) $OLD($1)
            incr NEW($1)
        }
        default {
            return OK
        }
    }
    return [array get NEW]
$$ LANGUAGE pltcl;

CREATE TABLE mytab (num integer, description text, modcnt integer);

CREATE TRIGGER trig_mytab_modcount BEFORE INSERT OR UPDATE ON mytab
    FOR EACH ROW EXECUTE PROCEDURE trigfunc_modcount('modcnt');

注意,触发器函数本身不知道列名,列名通过触发器参数提供。这样,同一个触发器函数就可以在不同表上复用。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。