有没有一种方法可以在触发器函数中获取转换表的修改/插入列列表?
即:
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();
我要在表格中插入一行:
INSERT INTO t1 (c1) VALUES('tup5')
我想获取过渡表new_table
中的插入/更新列的列表(在本例中为(c1)
)
谢谢!
答案 0 :(得分:2)
过渡表的结构与触发表的结构相同。
使用TG_RELID
或TG_TABLE_SCHEMA
和TG_TABLE_NAME
查询pg_catalog.pg_attribute
或information_schema.columns
的定义。