37.6. PL/Perl 觸發器

PL/Perl 現在可以透過使用 $_TD 散列引用來書寫觸發器函數。

PL/Perl 可以用於書寫觸發器函數。在觸發器函數里,散列引用 $_TD 包含有關目前觸發器事件的訊息。散列引用 $_TD 的字串是:

$_TD->{new}{foo}

字串 fooNEW 值。

$_TD->{old}{foo}

一個字串 fooOLD 值。

$_TD->{name}

被調用的觸發器的名字

$_TD->{event}

觸發器事件:INSERTUPDATEDELETE,或者 UNKNOWN

$_TD->{when}

何時調用觸發器:BEFOREAFTER,或者 UNKNOWN

$_TD->{level}

觸發器的級別:ROWSTATEMENT,或者 UNKNOWN

$_TD->{relid}

觸發觸發器的資料表的 OID

$_TD->{relname}

觸發觸發器的資料表的名字

@{$_TD->{argv}}

觸發器函數的參數

$_TD->{argc}

觸發器函數的參數個數

觸發器返回下列之一:

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