↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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.1 已结束支持。 请参阅 当前版本手册.

24.3. 触发器过程 #

PL/pgSQL 可以用来定义触发器过程。它们用通常的 CREATE FUNCTION命令创建,是一个没有参数、返回类型为OPAQUE的函数。

用作触发器过程的函数有一些Postgres 特有的细节。

首先它们的顶层块声明部分中会自动创建一些特殊变量。它们是

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)得到 NULL 值。

其次它们必须返回 NULL,或者返回一个恰好包含触发该触发器的表的结构记录/行。AFTER 触发器总是返回 NULL 值也没有影响。BEFORE 触发器返回 NULL 时会通知触发器管理器跳过对这一实际行的操作。否则,返回的记录/行会在操作中替换被插入/更新的行。可以直接在 NEW 中替换单个值然后返回它,也可以构造一个完整的新记录/行来返回。

例 24.1. 一个 PL/pgSQL 触发器过程示例

这个触发器保证,每当表中有行被插入或更新时,当前的用户名和时间都会被盖章到该行中。而且它还保证给出了员工的名字并且薪水是一个正值。

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

CREATE FUNCTION emp_stamp () RETURNS OPAQUE 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();


报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.