【问题标题】:How to apply a update after an inser or update POSTGRESQL Trigger如何在插入或更新 POSTGRESQL 触发器后应用更新
【发布时间】:2014-06-08 03:14:49
【问题描述】:

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

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;

【问题讨论】:

  • 您想要做的与手册中给出的示例大致相同。你看过关于 pl/pgsql 触发器的文档吗?
  • 是的,但我只是意识到我的触发器是递归的,这就是它不起作用的原因。
  • ...这就是为什么手册显示使用修改 NEW 的 BEFORE 触发器的原因。

标签: postgresql triggers sql-update


【解决方案1】:

您的触发功能可能比您拥有的要容易得多。请记住,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();

【讨论】:

  • 实际上,它不起作用,我不知道原因,我收到以下错误:错误:límite de profundidad de stack alcanzado 提示:Incremente el parametro de configuración «max_stack_depth»(实际 2048kB), después de asegurarse que el límite de profundidad de stack de la plataforma es adecuado。 CONTEXT: sentencia SQL: «UPDATE profile SET lastupdate = now() WHERE oid = NEW.oid» 函数 PL/pgSQL fn_update_profile() en la linea 3 en sentencia SQL sentencia SQL: «UPDATE profile SET lastupdate = now() WHERE oid = NEW.oid»
  • 您的profile 表似乎与触发函数相关联,因此您得到递归并最终导致堆栈溢出。如果是这种情况,您应该将其设为BEFORE INSERT OR UPDATE 触发器并简单地设置NEW.lastupdate := now(),然后设置RETURN NEW
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多