【问题标题】:trigger to update particular column in table A after update on table A更新表 A 后触发更新表 A 中的特定列
【发布时间】:2014-04-02 13:41:44
【问题描述】:

我正在使用 postgresql,我想通过汇总表中的其他列来更新列。

EX: 表名是 A。当 col1 或 col2 或表 A​​ 中的任何列值时 已更新,则 col6 的值也应更新为 col6=(col1+col2+col3)

为此,我编写了如下更新触发器。

CREATE FUNCTION update_total2() RETURNS TRIGGER AS $_$
BEGIN
    UPDATE hr_contract SET "x_TOTAL"=(NEW.x_othr_allow+NEW.x_med_allw+NEW."x_LTA"+NEW.wage+NEW.supplementary_allowance) WHERE id = OLD.id;
    RETURN OLD;
END $_$ LANGUAGE 'plpgsql';


CREATE TRIGGER hr_contract_after_update
    AFTER update ON hr_contract

    FOR EACH ROW
    EXECUTE PROCEDURE update_total2();

报错如下..

ERROR:  stack depth limit exceeded
HINT:  Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."res_users" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"
SQL statement "UPDATE hr_contract SET "x_TOTAL"=(NEW.x_othr_allow+OLD.x_med_allw+OLD."x_LTA"+OLD.wage+OLD.supplementary_allowance) WHERE id = OLD.id"
PL/pgSQL function update_total_result() line 3 at SQL statement
SQL statement "UPDATE hr_contract SET "x_TOTAL"=(NEW.x_othr_allow+OLD.x_med_allw+OLD."x_LTA"+OLD.wage+OLD.supplementary_allowance) WHERE id = OLD.id"

任何帮助都非常有用...

【问题讨论】:

    标签: sql database postgresql triggers


    【解决方案1】:

    尝试检查该行是否有任何变化,并设置字段 x_TOTAL 的值(如果有):

    CREATE FUNCTION update_total2() RETURNS TRIGGER AS $_$
      BEGIN
    --Check if any of columns has been updated:
      if tg_op='UPDATE' and  old <> new then 
        NEW."x_TOTAL"= NEW.x_othr_allow+NEW.x_med_allw+NEW."x_LTA"+NEW.wage+NEW.supplementary_allowance);
      end if;
    
    RETURN NEW;
    END $_$ LANGUAGE 'plpgsql';
    
    --Associate triger to table on BEFORE update events
    CREATE TRIGGER hr_contract_after_update
        before update ON hr_contract
    
        FOR EACH ROW
        EXECUTE PROCEDURE update_total2();
    

    Trigger documentation

    【讨论】:

      【解决方案2】:

      我不熟悉 postgresql 语法,但问题是您正在进行递归更新。您的函数 update_total2 不得对触发器上正在更新的同一个表使用 UPDATE。

      请查看文档以获取详细信息,您只需在触发器本身中执行以下操作:

      FOR EACH ROW
          NEW.x_TOTAL = NEW.x_othr_allow + NEW.x_med_allw  + NEW."x_LTA" + NEW.wage + NEW.supplementary_allowance
      

      【讨论】:

      • 没有更新声明!不需要哪里的原因。查看修改后的答案。
      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多