PL/pgSQL 可以用于定义触发器过程. 它们通过普通的 CREATE FUNCTION命令创建为没有参数并且返回 OPAQUE 类型的函数.
做为触发器过程的函数有一些 Postgres 特有的细节说明.
首先他们有一些在顶层的声明段里自动定义的特殊变量.有如下这些
数据类型是 RECORD; 该变量保存着行(ROW)一级的触发器在 INSERT/UPDATE 操作时的新的数据库行.
据类型是 RECORD; 该变量保存着行(ROW)一级的触发器在 INSERT/UPDATE 操作时的旧的数据库行。
数据类型是 name;该变量包含实际触发的触发器名. fired.
数据类型是 text;是一个由触发器定义决定的字符串, 要么是 BEFORE 要么是 AFTER.
据类型是 text;是一个由触发器定义决定的字符串, 要么是 ROW 要么是 STATEMENT.
数据类型是 text;是一个说明触发触发器的实际操作的字符串, 可以是 INSERT,UPDATE 或者 DELETE.
数据类型是 oid;是导致触发器调用的表的对象标识(OID).
数据类型是 name;是激活触发器调用的表的名称.
数据类型是 integer; 是在CREATE TRIGGER 语句里面赋予触发器过程的参数的个数.
数据类型是 text 的数组;是 CREATE TRIGGER语句里的参数. 下标从 0 开始记数,并且可以由一个表达式来表示.非法下标( < 0 or >= tg_nargs)导致一个 NULL 值的返回.
其次,它们必须返回 NULL 或者是 一个与导致触发器运行的表的记录/行完全一样的结构的数据. AFTER 类型的触发器可以总是返回一个没有意义的 NULL 值. BEFORE 类的触发器如果返回一个 NULL,将发送一个信号给触发器管理器 忽略对实际行的操作.否则,返回的记录/行将代替插入/更新操作中的行. 我们可能用一个值直接代替 NEW 里的数值并且 返回之或者我们也可以构建一个完全新的返回记录/行.
Example 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 -- 检查是否给出了 empname 和 salary 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; -- 我们必须付帐给谁? IF NEW.salary < 0 THEN RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname; END IF; -- 记住何时何人的薪水被修改了 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();