更新时间:2026-10-21 GMT+08:00
分享

触发器函数

  • pg_get_triggerdef(oid)

    描述:获取触发器的定义信息。

    参数:待查触发器的OID。

    返回值类型:text

    示例:

    -- 创建表tri_insert。
    gaussdb=# CREATE TABLE tri_insert (a int, b int);
    CREATE TABLE
    -- 创建函数trigger_func。
    gaussdb=# CREATE FUNCTION trigger_func() RETURNS trigger LANGUAGE plpgsql AS '
     BEGIN
     RAISE NOTICE ''trigger_func(%) called: action = %, when = %, level = %'', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL;
     RETURN NULL;
     END;';
    CREATE FUNCTION
    -- 创建触发器before_ins_stmt_trig。
    gaussdb=# CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON tri_insert FOR EACH row EXECUTE PROCEDURE trigger_func('before_ins_stmt');
    CREATE TRIGGER
    -- 创建触发器after_ins_when_trig。
    gaussdb=# CREATE TRIGGER after_ins_when_trig AFTER INSERT ON tri_insert FOR EACH ROW WHEN (new.a IS NOT NULL) EXECUTE PROCEDURE trigger_func('after_ins_when');
    CREATE TRIGGER
    -- 查看表tri_insert的触发器定义信息。
    gaussdb=# SELECT pg_get_triggerdef(oid) FROM pg_trigger WHERE tgrelid = 'tri_insert'::regclass;
                                                                       pg_get_triggerdef                                                                    
    --------------------------------------------------------------------------------------------------------------------------------------------------------
     CREATE TRIGGER after_ins_when_trig AFTER INSERT ON tri_insert FOR EACH ROW WHEN ((new.a IS NOT NULL)) EXECUTE PROCEDURE trigger_func('after_ins_when')
     CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON tri_insert FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_stmt')
    (2 rows)
  • pg_get_triggerdef(oid, boolean)

    描述:获取触发器的定义信息。

    参数:待查触发器的OID及是否以pretty方式展示。

    仅在创建trigger时指定WHEN条件的情况下,布尔类型参数才生效。

    返回值类型:text

    示例:

    -- 查看表tri_insert的触发器定义信息,以非pretty形式。
    gaussdb=# SELECT pg_get_triggerdef(oid, false) FROM pg_trigger WHERE tgrelid = 'tri_insert'::regclass;
                                                                       pg_get_triggerdef                                                                    
    --------------------------------------------------------------------------------------------------------------------------------------------------------
     CREATE TRIGGER after_ins_when_trig AFTER INSERT ON tri_insert FOR EACH ROW WHEN ((new.a IS NOT NULL)) EXECUTE PROCEDURE trigger_func('after_ins_when')
     CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON tri_insert FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_stmt')
    (2 rows)
    
    -- 查看表tri_insert的触发器定义信息,以pretty形式。
    gaussdb=# SELECT pg_get_triggerdef(oid, true) FROM pg_trigger WHERE tgrelid = 'tri_insert'::regclass;
                                                                      pg_get_triggerdef                                                                   
    ------------------------------------------------------------------------------------------------------------------------------------------------------
     CREATE TRIGGER after_ins_when_trig AFTER INSERT ON tri_insert FOR EACH ROW WHEN (new.a IS NOT NULL) EXECUTE PROCEDURE trigger_func('after_ins_when')
     CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON tri_insert FOR EACH ROW EXECUTE PROCEDURE trigger_func('before_ins_stmt')
    (2 rows)
    
    -- 清理表tri_insert。
    gaussdb=# DROP TABLE tri_insert CASCADE;
    DROP TABLE
    -- 清理函数trigger_func。
    gaussdb=# DROP FUNCTION trigger_func;
    DROP FUNCTION
  • suppress_redundant_updates_trigger()

    描述:用于抑制无数据变化的更新操作。在更新数据操作前调用该函数,若更新后的数据相对更新前没有产生变化,则该更新操作不生效。

    返回值类型:触发器

    该函数为内置的触发器执行函数,只能在触发器定义时调用,且仅在BEFORE UPDATE触发器中生效。

    示例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -- 创建表tri_update。
    gaussdb=# CREATE TABLE tri_update (a int, b int);
    CREATE TABLE
    -- 插入数据(1,1)。 
    gaussdb=# INSERT INTO tri_update VALUES(1,1);
    INSERT 0 1
    -- 创建BEFORE UPDATE触发器,触发器函数为suppress_redundant_updates_trigger。
    gaussdb=# CREATE TRIGGER before_update_trig BEFORE UPDATE ON tri_update FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger();
    WARNING:  Trigger function with non-plpgsql type is not recommended.
    DETAIL:  Non-plpgsql trigger function are not shippable by default.
    HINT:  Unshippable trigger may lead to bad performance.
    CREATE TRIGGER
    -- 更新表中数据不变,依旧为(1,1),不执行更新操作。
    gaussdb=# UPDATE tri_update SET b=1;
    UPDATE 0
    -- 清理表tri_update。
    gaussdb=# DROP TABLE tri_update CASCADE;
    DROP TABLE
    

相关文档