从 %current% 表中选择的 PostgreSQL 触发器函数

Nat*_*u16 7 postgresql trigger dynamic-sql plpgsql functions

我有多个具有相同列名的表,它们仅在列值上有所不同,例如:

tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

从 a 到 z 的 26 个表。每个表都有一个触发器,它调用一个触发器函数,它执行完全相同的操作:

SELECT columnname FROM tbl_log_a
Run Code Online (Sandbox Code Playgroud)

除此之外,我所有的触发器功能都做同样的事情。它们的不同之处在于:

select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

所以我必须创建 26 个触发函数,每个tbl_log_%letter%. 有没有办法告诉触发器函数:

SELECT columnname FROM %currenttable%
Run Code Online (Sandbox Code Playgroud)

通过%currenttable%我的意思是当触发放在桌子上。或者:

SELECT columnname FROM tbl_log_%letter%
Run Code Online (Sandbox Code Playgroud)

Postgres 9.1 中可能吗?我正在阅读动态确定的表。有什么线索吗?我想将表名本身存储在一个变量中,而不是该表中的列,因为触发器函数适用于该表中的多个列。

TG_TABLE_NAME
TG_TABLE_SCHEMA
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 9

我建议您使用触发器参数,但实际上没有必要。您可以使用自动变量 TG_TABLE_SCHEMAand TG_TABLE_NAME,或使用TG_RELID. 这些,连同EXECUTE动态 SQL,让你做你想做的事:

BEGIN
    EXECUTE format('SELECT colname FROM %I', TG_RELID)
END;
Run Code Online (Sandbox Code Playgroud)

或者

BEGIN
    EXECUTE format('SELECT colname FROM %I.%I', TG_TABLE_SCHEMA, TG_TABLE_NAME)
END;
Run Code Online (Sandbox Code Playgroud)

(当然,这些不会按原样工作,因为SELECT数据没有目的地。您必须使用EXECUTE format(..) INTO ...将结果存储到DECLAREd 变量中),例如

DECLARE
    _colvar integer;
BEGIN
    EXECUTE format('SELECT colname FROM %I.%I', TG_TABLE_SCHEMA, TG_TABLE_NAME) INTO _colvar;
    RAISE NOTICE 'colname value was %',_colvar;
END;
Run Code Online (Sandbox Code Playgroud)