VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DML 触发器动作

本节主要介绍 DML 触发器的触发动作。

使用存储过程作为触发动作

要使用存储过程作为触发函数,需要首先定义函数,再创建触发器。以下是一个触发器示例。

CREATE TABLE vb_trigger_src_tbl(id1 INT, id2 INT, id3 INT);
CREATE TABLE vb_trigger_des_tbl(id1 INT, id2 INT, id3 INT);

1、创建 INSERT 触发函数:

CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
    $$
    DECLARE
    BEGIN
            INSERT INTO vb_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
            RETURN NEW;
    END
    $$ LANGUAGE PLPGSQL;

2、创建 UPDATE 触发函数:

CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS
    $$
    DECLARE
    BEGIN
            UPDATE vb_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1;
            RETURN OLD;
    END
    $$ LANGUAGE PLPGSQL;

3、创建 DELETE 触发函数:

CREATE OR REPLACE FUNCTION TRI_DELETE_FUNC() RETURNS TRIGGER AS
    $$
    DECLARE
    BEGIN
            DELETE FROM vb_trigger_des_tbl WHERE id1=OLD.id1;
            RETURN OLD;
    END
    $$ LANGUAGE PLPGSQL;

4、分别创建触发器,对应 INSERT、UPDATE 与 DELETE 操作。

CREATE TRIGGER insert_trigger
    BEFORE INSERT ON vb_trigger_src_tbl
    FOR EACH ROW
    EXECUTE PROCEDURE tri_insert_func();

CREATE TRIGGER update_trigger
    AFTER UPDATE ON vb_trigger_src_tbl  
    FOR EACH ROW
    EXECUTE PROCEDURE tri_update_func();

CREATE TRIGGER delete_trigger
    BEFORE DELETE ON vb_trigger_src_tbl
    FOR EACH ROW
    EXECUTE PROCEDURE tri_delete_func();

PL/pgSQL类型触发器函数特殊变量

触发器函数与普通函数的区别主要在于,触发器函数不能有参数,并且返回类型为 trigger。在 Vastbase 数据库中,系统创建了以下特殊变量用于函数内部调用。

表 2 PL/pgSQL类型触发器函数特殊变量

变量名

变量含义

NEW

INSERT 及 UPDATE 操作涉及 tuple 信息中的新值,对 DELETE 为空。

OLD

UPDATE 及DELETE 操作涉及 tuple 信息中的旧值,对 INSERT 为空。

TG_NAME

触发器名称。

TG_WHEN

触发器触发类型。

取值范围:BEFORE、AFTER、INSTEAD OF。

TG_LEVEL

触发频率。

取值范围:ROW、STATEMENT。

TG_OP

触发操作。

取值范围:INSERT、UPDATE、DELETE、TRUNCATE。

TG_RELID

触发器所在表OID。

TG_RELNAME

触发器所在表名(已废弃,现用TG_TABLE_NAME替代)。

TG_TABLE_NAME

触发器所在表名。

TG_TABLE_SCHEMA

触发器所在表的SCHEMA信息。

TG_NARGS

触发器函数参数个数。

TG_ARGV[]

触发器函数参数列表。