Sql 在对表A进行更新后更新表A中特定列的触发器

Sql 在对表A进行更新后更新表A中特定列的触发器,sql,database,postgresql,triggers,Sql,Database,Postgresql,Triggers,我正在使用postgresql,我想通过汇总表中的其他列来更新一列 例如:表名是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+NE

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

例如:表名是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"

任何帮助都非常有用…

我不熟悉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

尝试检查该行上是否有任何更改,如果有,请设置字段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();
CREATE FUNCTION update_total2()将触发器返回为$_$
开始
--检查是否有任何列已更新:
如果tg_op='UPDATE'和新旧
新的。“x_总计”=新的x_其他允许+新的x_医疗所有+新的。“x_LTA”+新的工资+新的补充津贴);
如果结束;
归还新的;
结束$语言“plpgsql”;
--在更新事件之前将触发器与表关联
更新后创建触发人力资源合同
更新人力资源部合同前
每行
执行过程更新_total2();

没有更新语句!不需要去哪里。见修改后的答案。