我已经检查了类似的威胁,但是与我尝试做的不完全匹配。
我有两个相同的表:
t_data
:我们将提供最近两个月的数据。将有一份删除两个月以上数据的工作。
t_data_historical
:我们将拥有所有数据。
我想做的:如果对t_data
执行了INSERT操作,我想将同一查询“克隆”到t_data_historical
。
我已经知道可以使用触发器来完成此操作,但是我不了解某些事情:在触发器定义中,我需要了解列和值,并且我不想关心INSERT查询(我相信进行查询的客户端),我只克隆它。
答案 0 :(得分:0)
如果您知道历史记录表将具有相同的定义,并且始终以这种方式构造名称,则可以
EXECUTE format('INSERT INTO %I.%I VALUES (($1).*)',
TG_TABLE_SCHEMA,
TG_TABLE_NAME || '_historical')
USING NEW;
在您的触发功能中。
这将适用于所有表,并且您不需要知道实际的列。
答案 1 :(得分:0)
Laurenz, 我创建了触发器,例如:
CREATE OR REPLACE FUNCTION copy2historical() RETURNS trigger AS
$BODY$
BEGIN
EXECUTE format('INSERT INTO %I.%I VALUES (($1).*)', TG_TABLE_SCHEMA, TG_TABLE_NAME || '_historical')
USING NEW;
END;
RETURN NULL;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER copy2historical_tg
AFTER INSERT
ON t_data
FOR EACH ROW
EXECUTE PROCEDURE copy2historical();
感谢您的帮助。