2014-06-08 73 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