【问题标题】:UPDATE ANOTHER COLUMN IN AFTER UPDATE TRIGGER在更新触发后更新另一列
【发布时间】:2020-03-03 04:14:20
【问题描述】:

我有一个包含三列的表:id、date 和 dateDekete

我尝试在更新另一列(列日期)之后使用更新后触发器对列 dateDelete 执行更新。 我用来创建触发器的代码如下:

CREATE OR REPLACE FUNCTION update_delete_date_allocation()
  RETURNS trigger LANGUAGE plpgsql AS  $body$
    BEGIN
        NEW."dateDelete" := NEW.date + 1;
        RETURN NEW;
      END;
 $body$;

CREATE TRIGGER delete_date_allocation_trg
    AFTER INSERT OR UPDATE ON client.client_portfolio_allocation
    FOR EACH ROW
    EXECUTE PROCEDURE update_delete_date_allocation();

虽然代码执行良好,没有错误消息,但我尝试更新的后一列没有改变。

我想知道是否可以这样做。如果是这样,我应该在我的代码中进行哪些更改?

我使用的是 Postgres 11.5。

【问题讨论】:

    标签: postgresql database-trigger


    【解决方案1】:

    您不能在 AFTER 触发器中更改新记录,您需要将您的触发器声明为 BEFORE 触发器:

    创建触发器 delete_date_allocation_trg
        之前在client.client_portfolio_allocation上插入或更新
        每一行
        执行程序 update_delete_date_allocation();

    【讨论】:

    • 感谢您的回复。实际上我需要在更新后完成。我有一个我根据日期列值检查的条件列表。
    • 您可以更改 AFTER 触发器中的 new 行。如果您想在检查失败时中止插入或更新,您也可以在 BEFORE 触发器中执行此操作。
    • 我认为您误解了 BEFORE 和 AFTER 的含义。两者都是声明本身的一部分。简而言之,可以分解为:启动 DML 过程,执行语句前触发器,对于每一行:执行前行触发器,执行最终数据合并和约束验证,执行后行触发器,执行语句后触发器,终止 DML陈述。任何步骤都可以发送执行以终止 DML。 After和Before不是指语句,而是指数据合并和验证步骤。这就是为什么您不能在 After 触发器中更改数据内容,它不会被验证。
    • 哦,好吧。那我的坏。我尝试使用 BEFORE 并且它有效。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多