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

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 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

19.9. 触发器过程 #

PL/pgSQL 可用于定义触发器过程。触发器 过程用 CREATE FUNCTION 命令创建,声明为无参数、返回 类型为 TRIGGER 的函数。注意,即使函数期望接收 CREATE TRIGGER 中指定的参数,也必须声明为无参数—— 触发器参数通过 TG_ARGV 传递,如下所述。

当 PL/pgSQL 函数作为触发器被调用时,顶层 块中会自动创建若干特殊变量。它们是:

NEW

数据类型 RECORD;在行级触发器中保存 INSERT/UPDATE 操作的新数据库行的变量。

OLD

数据类型 RECORD;在行级触发器中保存 UPDATE/DELETE 操作的旧数据库行的变量。

TG_NAME

数据类型 name;包含实际触发的触发器名称的变量。

TG_WHEN

数据类型 text;依据触发器定义为 BEFORE 或 AFTER 的字符串。

TG_LEVEL

数据类型 text;依据触发器定义为 ROW 或 STATEMENT 的字符串。

TG_OP

数据类型 text;取值为 INSERT、 UPDATE 或 DELETE 的字符串, 说明触发器是针对哪个操作触发的。

TG_RELID

数据类型 oid;导致触发器调用的表的对象 ID。

TG_RELNAME

数据类型 name;导致触发器调用的表的名称。

TG_NARGS

数据类型 integer;CREATE TRIGGER 语句中给触发器过程的参数个数。

TG_ARGV[]

数据类型为 text 的数组;来自 CREATE TRIGGER 语句的参数。索引从 0 计数, 并且可以以表达式形式给出。无效索引(< 0 或 >= tg_nargs)得到空值。

触发器函数必须返回空值,或返回与触发该触发器的表的结构完全相同的 记录/行值。BEFORE 触发器可以返回空值,向触发器管理器示意跳过这一行 的其余操作(即不触发后续触发器,并且不对这一行执行 INSERT/UPDATE/DELETE)。如果返回非空值,操作将以该行值继续进行。 注意,返回与 NEW 原值不同的行值会改变将被插入或更新的行。 可以直接替换 NEW 中的单个值并返回它,也可以构造一个 完整的新记录/行来返回。

AFTER 触发器的返回值被忽略;不妨总是返回空值。但 AFTER 触发器仍可 通过引发错误中止操作。

例 19.1. 一个 PL/pgSQL 触发器过程例子

这个示例触发器确保每当表中有行被插入或更新时,当前用户名和时间都被 记入该行。它还确保给出了雇员姓名,并且薪金为正值。

CREATE TABLE emp (
    empname text,
    salary integer,
    last_date timestamp,
    last_user text
);

CREATE FUNCTION emp_stamp () RETURNS TRIGGER AS '
    BEGIN
        -- Check that empname and salary are given
        IF NEW.empname ISNULL THEN
            RAISE EXCEPTION ''empname cannot be NULL value'';
        END IF;
        IF NEW.salary ISNULL THEN
            RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
        END IF;

        -- Who works for us when she must pay for?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
        END IF;

        -- Remember who changed the payroll when
        NEW.last_date := ''now'';
        NEW.last_user := current_user;
        RETURN NEW;
    END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

提交更正

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