受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

43.6. PL/Perl 触发器 #

PL/Perl 可用于编写触发器函数。在触发器函数中,哈希引用 $_TD 包含有关当前触发器事件的信息。 $_TD 是一个全局变量,对触发器的每一次调用都会得到 一个单独的局部值。$_TD 哈希引用包含以下字段:

$_TD->{new}{foo} #

fooNEW

$_TD->{old}{foo} #

fooOLD

$_TD->{name} #

被调用的触发器名称

$_TD->{event} #

触发器事件:INSERTUPDATEDELETETRUNCATE或者UNKNOWN

$_TD->{when} #

触发器被调用的时机:BEFOREAFTERINSTEAD OFUNKNOWN

$_TD->{level} #

触发器级别:ROWSTATEMENT或者UNKNOWN

$_TD->{relid} #

触发该触发器的表的 OID

$_TD->{table_name} #

触发该触发器的表名

$_TD->{relname} #

触发该触发器的表名。该字段已废弃,并且可能会在未来版本中移除。 请改用 $_TD->{table_name}。

$_TD->{table_schema} #

触发该触发器的表所在模式的名称

$_TD->{argc} #

触发器函数的参数数目

@{$_TD->{args}} #

触发器函数的参数。如果 $_TD->{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";    # skip INSERT/UPDATE command
    } elsif ($_TD->{new}{v} ne "immortal") {
        $_TD->{new}{v} .= "(modified by trigger)";
        return "MODIFY";  # modify row and execute INSERT/UPDATE command
    } else {
        return;           # execute INSERT/UPDATE command
    }
$$ LANGUAGE plperl;

CREATE TRIGGER test_valid_id_trig
    BEFORE INSERT OR UPDATE ON test
    FOR EACH ROW EXECUTE FUNCTION valid_id();

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。