0

我正在尝试编写一个在执行插入时执行的触发器函数。条件是,如果 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
4

1 回答 1

0

从您的示例中,我看起来就像您正在尝试以 Oracle 的方式做事。PostgreSQL 是不同的。我也没有在代码中的任何地方看到游标的任何用途,所以这个问题可能会产生误导。

在 PostgreSQL 中,触发器只能调用过程并且过程必须在很大程度上是自包含的。本质上,您将不得不稍微重构您的代码。之后唯一接受的语法FOR EACH ROWEXECUTE PROCEDURE,因此您的其他逻辑必须移至用户定义的函数中。如果需要,您可以WHEN通过调用函数在条件中应用该函数(如果您的函数返回 bool)。或者您可以将其构建到您的触发逻辑中。

于 2013-04-18T02:04:04.330 回答