# 45.6.PL/Perl触发器

PL/Perl可用于编写触发器函数。在触发器函数中,哈希引用$\u TD包含有关当前触发器事件的信息。$\u TD是一个全局变量,它为触发器的每次调用获取一个单独的局部值。大地$\u TD哈希引用是:

$_TD->{new}{foo}

列的值

$_TD->{old}{foo}

古老的列的值

$_TD->{name}

正在调用的触发器的名称

$_TD->{event}

触发事件:插入,使现代化,删去, 截断未知的

$_TD->{when}

触发时:之前, 之后, 而不是未知的

$_TD->{level}

触发级别:一行, 陈述未知的

$_TD->{relid}

触发触发器的桌子的OID

$_TD->{table_name}

触发触发器的表的名称

$_TD->{relname}

触发触发器的表的名称。这已被弃用,并可能在未来的版本中删除。请使用$_TD->{表_取而代之的是}。

$_TD->{table_schema}

触发触发器的表所在的架构的名称

$_TD->{argc}

触发器函数的参数数

@{$_TD->{args}

触发器函数的参数。如果$_TD->{argc}是0.

行级触发器可以返回以下选项之一:

回来

执行操作

“跳过”

不要执行这个操作

“修改”

表明行被触发器函数修改

以下是一个触发函数的示例,说明了上述一些功能:

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();