Postgres获取过渡表列

时间:2019-11-19 02:27:10

标签: postgresql plpgsql

有没有一种方法可以在触发器函数中获取转换表的修改/插入列列表?

即:

CREATE TABLE t1 (c1 text NOT NULL, c2 integer);
INSERT INTO t1 VALUES('tup1', 10), ('tup2', 20);

CREATE FUNCTION show_modified_tups() RETURNS TRIGGER AS $$
DECLARE
r1 record;
BEGIN
IF (TG_OP = 'DELETE') THEN
    FOR r1 IN SELECT * FROM old_table
    LOOP
        raise notice 'OLD: %', r1;
    END loop;
ELSIF (TG_OP = 'UPDATE') THEN
    FOR r1 IN SELECT * FROM new_table
    LOOP
        raise notice 'NEW: %', r1;
    END loop;
    FOR r1 IN SELECT * FROM old_table
    LOOP
        raise notice 'OLD: %', r1;
    END loop;
ELSIF (TG_OP = 'INSERT') THEN
    FOR r1 IN SELECT * FROM new_table
    LOOP
        raise notice 'NEW: %', r1;
    END loop;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER t1_ins
 AFTER INSERT ON t1 REFERENCING NEW TABLE AS new_table
 FOR EACH STATEMENT EXECUTE PROCEDURE show_modified_tups();

CREATE TRIGGER t1_upd
 AFTER UPDATE ON t1 REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
 FOR EACH STATEMENT EXECUTE PROCEDURE show_modified_tups();

CREATE TRIGGER t1_del
 AFTER DELETE ON t1 REFERENCING OLD TABLE AS old_table
 FOR EACH STATEMENT EXECUTE PROCEDURE show_modified_tups();

(摘自https://postgresrocks.enterprisedb.com/t5/Postgres-Gems/Can-modified-tuples-be-accessed-using-a-statement-level-trigger/ba-p/2416

我要在表格中插入一行:

INSERT INTO t1 (c1) VALUES('tup5')

我想获取过渡表new_table中的插入/更新列的列表(在本例中为(c1)

谢谢!

1 个答案:

答案 0 :(得分:2)

过渡表的结构与触发表的结构相同。

使用TG_RELIDTG_TABLE_SCHEMATG_TABLE_NAME查询pg_catalog.pg_attributeinformation_schema.columns的定义。