2014-06-08 75 views
-1

如何在插入或更新后应用更新POSTGRESQL;我有一个表中有一个字段lastupdate;我希望在更新行时设置该字段或者插入时。 我试过这个触发器,但它不工作!帮帮我!!如何在inser或更新后应用更新POSTGRESQL触发器

CREATE OR REPLACE FUNCTION fn_update_profile() 
          RETURNS TRIGGER AS $update_profile$ 
    BEGIN 
    IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN 
      UPDATE profile SET lastupdate=now() where oid=OLD.oid; 
      RETURN NULL; 
    ELSEIF (TG_OP = 'DELETE') THEN 
     RETURN NULL; 
     END IF; 
    RETURN NULL; -- result is ignored since this is an AFTER trigger 
    END; 
$update_profile$ LANGUAGE plpgsql; 
+0

您要做的与本手册中给出的示例大致相同。你看过pl/pgsql触发器上的文档吗? –

+0

是的,但我只是意识到我的触发器是递归的,这就是为什么它不起作用。 – user3718906

+0

...这就是为什么手册显示使用修改NEW的BEFORE触发器的原因。 –

回答

0

您的触发器功能可能比您更容易。请记住,PG会做更新或原始表的插入,你只需要对付保持profile表最多最新:

CREATE OR REPLACE FUNCTION fn_update_profile() 
RETURNS TRIGGER AS $update_profile$ 
BEGIN 
    UPDATE profile SET lastupdate = now() WHERE oid = NEW.oid; 
    RETURN NEW; 
END; 
$update_profile$ LANGUAGE plpgsql; 

INSERTUPDATE触发功能都使用NEW参数; INSERT触发器功能没有OLD参数。如果成功,您应始终从触发功能中返回NEW(或DELETE触发中的OLD),即使它是AFTER INSERT OR UPDATE触发器;如果返回NULL,整个操作将回滚。如果您在插入或更新后定义要触发的实际触发器,则应该很好:

CREATE TRIGGER tr_update_profile 
AFTER INSERT OR UPDATE ON my_table 
FOR EACH ROW EXECUTE PROCEDURE fn_update_profile(); 
+0

其实,它不工作,我不知道原因,我得到以下错误:错误:límitede profundidad de stack alcanzado 提示:Incremente elparámetrodeconfiguración«max_stack_depth»(actualmente 2048kB),despuésde asegurarse que ellímite de profundidad de stack de la plataforma es es adecuado。 ()更新配置文件SET lastupdate = now()更新配置文件SET lastupdate =现在()更新配置文件SET lastupdate = now()WHERE oid = NEW.oid» funciónPL/pgSQL fn_update_profile()en lalínea3 en sentencia SQL sentencia SQL: WHERE oid = NEW.oid» – user3718906

+0

看起来你的'profile'表与触发器函数关联,所以你得到了递归并最终出现堆栈溢出。如果是这样的话,你应该把它设为'BEFORE INSERT OR UPDATE'触发器,并简单地设置'NEW.lastupdate:= now()',然后'RETURN NEW'。 – Patrick