ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 42.6\. PL/Perl 触发器 PL/Perl 可以用来书写触发器函数。在一个触发器函数中,散列引用`$_TD` 包含了当前触发事件的信息。`$_TD`是一个全局变量, 它对于每次触发器调用都能够获取一个局部值。`$_TD`散列引用的字段有: `$_TD-&gt;{new}{foo}` 字段`foo`的`NEW`值 `$_TD-&gt;{old}{foo}` 字段`foo`的`OLD`值 `$_TD-&gt;{name}` 被调用的触发器的名字 `$_TD-&gt;{event}` 触发器事件:`INSERT`, `UPDATE`, `DELETE`, `TRUNCATE`, 或 `UNKNOWN` `$_TD-&gt;{when}` 何时调用触发器:`BEFORE`, `AFTER`, `INSTEAD OF`, 或 `UNKNOWN` `$_TD-&gt;{level}` 触发器的级别: `ROW`, `STATEMENT`, 或 `UNKNOWN` `$_TD-&gt;{relid}` 触发触发器的表的 OID `$_TD-&gt;{table_name}` 触发触发器的表的名字 `$_TD-&gt;{relname}` 触发触发器的表的名字。已经废弃了,并且可能在将来的版本中移除。请使用$_TD-&gt;{table_name}。 `$_TD-&gt;{table_schema}` 触发触发器的表的模式名 `$_TD-&gt;{argc}` 触发器函数的参数个数 `@{$_TD-&gt;{args}}` 触发器函数的参数,如果`$_TD-&gt;{argc}`为 0 则不存在。 行级别的触发器返回下列之一: `return;` 执行该操作 `"SKIP"` 不执行该操作 `"MODIFY"` 表明`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(); ```