我正在尝试编写一个执行插入时执行的触发器函数。条件是,如果id已经存在,那么time_create现在应该是time_dead。
CREATE function archive_temp() returns trigger as '
begin
insert into temporary_archive
values
(
OLD.id,
OLD.time_create,
OLD.time_dead,
OLD.fname,
current_user,
now(),
now(),
TG_OP
);
return null;
end;
' LANGUAGE 'plpgsql';
-----------------------------
CREATE TRIGGER archive_temps
AFTER DELETE OR UPDATE
on temporary_object
FOR EACH ROW
DECLARE
temporary_archive temporary_object.id%type;
begin
if inserting then
select id into temporary_archive
from temporary_object
where id = :old.id;
if temporary_archive is not null then
EXECUTE PROCEDURE archive_temps();
end if;
end if;ins
答案 0 :(得分:0)
从您的示例中我看起来就像您尝试以Oracle方式做事。 PostgreSQL是不同的。我也没有在你的代码中看到任何游标的使用,所以这个问题可能会产生误导。
在PostgreSQL中,触发器只能调用过程,并且过程必须基本上是自包含的。从本质上讲,您将不得不重新编写代码。 FOR EACH ROW
之后唯一接受的语法是EXECUTE PROCEDURE
,因此您的其他逻辑必须移动到用户定义的函数中。如果需要,可以通过调用函数(如果函数返回bool)在WHEN
条件下应用函数。或者你可以把它构建到你的触发逻辑中。