Postgresql
從 %current% 表中選擇的 PostgreSQL 觸發器函式
我有多個具有相同列名的表,它們僅在列值上有所不同,例如:
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_SCHEMA
和TG_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 ...
將結果儲存到DECLARE
d 變數中),例如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;