PostgreSQL 9.3.1 中文手册 | ||||
---|---|---|---|---|
Prev | Up | Chapter 42. PL/Perl - Perl 过程语言 | Next |
PL/Perl 可以用来书写触发器函数。在一个触发器函数中,散列引用$_TD 包含了当前触发事件的信息。$_TD是一个全局变量, 它对于每次触发器调用都能够获取一个局部值。$_TD散列引用的字段有:
字段foo的NEW值
字段foo的OLD值
被调用的触发器的名字
触发器事件:INSERT, UPDATE, DELETE, TRUNCATE, 或 UNKNOWN
何时调用触发器:BEFORE, AFTER, INSTEAD OF, 或 UNKNOWN
触发器的级别: ROW, STATEMENT, 或 UNKNOWN
触发触发器的表的 OID
触发触发器的表的名字
触发触发器的表的名字。已经废弃了,并且可能在将来的版本中移除。请使用$_TD->{table_name}。
触发触发器的表的模式名
触发器函数的参数个数
触发器函数的参数,如果$_TD->{argc}为 0 则不存在。
行级别的触发器返回下列之一:
执行该操作
不执行该操作
表明NEW行被触发器函数修改过
下面是一个触发器函数,演示了上面的一些东西。
CREATE TABLE test ( i int, v varchar ); CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$ if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) { return "SKIP"; #跳过 INSERT/UPDATE 命令 } elsif ($_TD->{new}{v} ne "immortal") { $_TD->{new}{v} .= "(modified by trigger)"; return "MODIFY"; #修改一行并且执行 INSERT/UPDATE 命令 } else { return; # 执行 INSERT/UPDATE 命令 } $$ LANGUAGE plperl; CREATE TRIGGER test_valid_id_trig BEFORE INSERT OR UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE valid_id();