我已经在PostgreSQL数据库表上创建了一个before update和after update触发器。
有一个要求是保留历史记录,同时为所述数据创建一个新记录。旧记录将被标记为已归档。
我计划使用临时表来跟踪NEW值并重置NEW值,使其标记为已归档。
在我的after update触发器中,我将从临时表中读取数据,并创建一个全新的活动记录。
我的问题是,在before update触发器中创建的临时表对after update触发器不可见。此外,我甚至无法将任何参数(类型为record)传递给after update触发器,因为这是不允许的。
我已经在Oracle数据库中使用Global Temporary table实现了所需的结果,但在PostgreSQL中遇到了困难。
以下是before update触发器函数的示例代码:
有一个要求是保留历史记录,同时为所述数据创建一个新记录。旧记录将被标记为已归档。
我计划使用临时表来跟踪NEW值并重置NEW值,使其标记为已归档。
在我的after update触发器中,我将从临时表中读取数据,并创建一个全新的活动记录。
我的问题是,在before update触发器中创建的临时表对after update触发器不可见。此外,我甚至无法将任何参数(类型为record)传递给after update触发器,因为这是不允许的。
我已经在Oracle数据库中使用Global Temporary table实现了所需的结果,但在PostgreSQL中遇到了困难。
以下是before update触发器函数的示例代码:
CREATE OR REPLACE FUNCTION trigger_fct_trig_trk_beforeupdate()
RETURNS trigger AS
$BODY$
DECLARE
some variable declarations;
BEGIN
Drop table IF EXISTS track_tmp_test;
CREATE TEMPORARY TABLE track_tmp_test(
...
);
Insert into track_tmp_test (........)
values(NEW., NEW..., NEW.., NEW...);
NEW... := OLD...;
NEW... := OLD.... ;
NEW... := OLD...;
Mark the NEW.status : = 'archived';
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER trig_trk_test_beforeupdate
BEFORE UPDATE ON test
FOR EACH ROW EXECUTE PROCEDURE trigger_fct_trig_trk_beforeupdate() ;
现在是UPDATE触发器的后续处理函数:
CREATE OR REPLACE FUNCTION trigger_fct_trg_trk_afterupdate()
RETURNS trigger AS
$BODY$
DECLARE
some variables;
-- insert into original table the data from temporary that was inserted in before update trigger
INSERT into TEST (....)
select ....
from track_tmp_test ;
-- delete data from temporary table after insert
delete from track_tmp_test ;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
在更新触发器中,有没有办法可以访问在更新前触发器函数中创建的临时表?
我不能使用永久表来保存值,因为触发器可能会由许多用户更新表中的数据。
AFTER
触发器丢失了,请将其添加到问题中。我打算采用完全不同的方法,但我需要这些信息。请澄清:您想要复制新行还是旧行 - 到相同表还是到具有相同结构的不同表?并且您是否想将新行标记为“已归档”?这很奇怪,但这就是您的评论所说的。 - Erwin Brandstetter