pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
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();
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。