Postgresql

從 %current% 表中選擇的 PostgreSQL 觸發器函式

  • August 26, 2015

我有多個具有相同列名的表,它們僅在列值上有所不同,例如:

tbl_log_a
tbl_log_b
tbl_log_c
...

從 a 到 z 的 26 個表。每個表都有一個觸發器,該觸發器呼叫一個執行完全相同的操作的觸發器函式:

SELECT columnname FROM tbl_log_a

除此之外,我所有的觸發函式都做同樣的事情。它們的不同之處在於:

select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...

所以我必須創建 26 個觸發函式,每個tbl_log_%letter%. 有沒有辦法告訴觸發功能:

SELECT columnname FROM %currenttable%

%currenttable%我的意思是放置觸發器的表。要麼:

SELECT columnname FROM tbl_log_%letter%

Postgres 9.1中可以嗎?我正在閱讀動態確定的表格。有什麼線索嗎?我想將表名本身儲存在一個變數中,而不是該表內的列,因為觸發器函式適用於該表內的多個列。

TG_TABLE_NAME
TG_TABLE_SCHEMA

我建議您使用觸發參數,但實際上沒有必要。您可以使用自動變數 TG_TABLE_SCHEMATG_TABLE_NAME,或使用TG_RELID。這些,連同EXECUTE動態 SQL,讓你做你想做的事:

BEGIN
   EXECUTE format('SELECT colname FROM %I', TG_RELID)
END;

要麼

BEGIN
   EXECUTE format('SELECT colname FROM %I.%I', TG_TABLE_SCHEMA, TG_TABLE_NAME)
END;

(當然這些不會按原樣工作,因為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;

引用自:https://dba.stackexchange.com/questions/112184