小编Nat*_*u16的帖子

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

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

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)

postgresql trigger dynamic-sql plpgsql functions

7
推荐指数
1
解决办法
4826
查看次数

使用当前行和当前表名作为变量的触发函数(最后部分)

就像我的第一个问题中详细介绍的那样,我有一个Postgres 9.1数据库,其中有多个表,这些表具有完全相同的列名,它们仅在列值上有所不同:

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

26 个表(从 a 到 z)。trfn_tbl_log_%letter%每个表都有一个触发器,它调用名为(from ato )的触发器函数z,该函数执行完全相同的操作:

CREATE OR REPLACE FUNCTION trfn_tbl_log_a_timetypespan()
  RETURNS trigger AS
$BODY$
DECLARE
v_timetype character varying;
v_timestmp_timetype timestamp without time zone;
v_timetypespan_resume interval;
v_stmtserial real;
v_sumtimetypespan_fnname interval;

BEGIN

IF NEW.timetype = 'lap' THEN
  SELECT timetype, timestmp, timetypespan FROM tbl_log_a WHERE fnname = NEW.fnname AND (timetype = 'start' OR timetype = 'resume') ORDER BY stmtserial DESC LIMIT 1 INTO v_timetype, v_timestmp_timetype, v_timetypespan_resume; …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql postgresql-9.1

5
推荐指数
1
解决办法
274
查看次数