在 "before update" 触发器中设置 NEW.column 设置上一个触发器调用的值

Setting NEW.column in "before update" trigger sets values from previous trigger call

我正在尝试为 table 创建 before update 触发器。基本上,在每次更新行时,我需要在同一 table.

的同一行上设置附加列

但是,由于某种原因,每个触发器调用都会导致设置上一个触发器调用的值。

这是我的触发器代码:

create or replace function test_trigger_func() returns trigger as $$
    declare
        v_department  text;
    begin
        select department.name into v_department
        from salesprofile
        left join (
           select department.name from salesprofile join department on department.id = (
               salesprofile.solutionscreteria #>> '{departments, 0}'
           )::int4 where salesprofile.id = NEW.id
        ) department on true
        where salesprofile.id = NEW.id
        group by department.name;
        
        NEW.department = v_department;
        
        raise notice 'DEP: %', v_department;
        raise notice 'NEW DEP: %', NEW.department;
        
        return NEW;
    end;
$$ language plpgsql;

drop trigger if exists test_trigger on salesprofile;

create trigger test_trigger before update on salesprofile
for each row execute procedure test_trigger_func();

test_trigger_func 函数内的 select 语句在函数外 运行 时正常工作。但是当从 test_trigger_func 函数内部调用 select 时,raise notice 语句显示不正确的(先前的)值。

salesprofile.solutionscreteria #>> '{departments, 0}' 语句包含 department table 中行的 id。我正在尝试在每个 salesprofile 行更新时从 "department".namesalesprofile table 行设置 department 列(通过修改 NEW.department = ...).


我得到的行为:


我不明白这是怎么发生的以及为什么会发生,我希望我能以一种易于理解的方式解释这种行为。

这是 potgresql 触发器的预期行为吗?如果没有,那么您能否解释一下发生了什么以及如何使其正常工作?

它是一个 BEFORE 触发器,因此它发生在 salesprofile table 具有 NEW 数据之前。我并不完全遵循,但我要说的是 salesprofile.solutionscreteria #>> '{departments, 0}' 使用的是现有(上一个)行,而不是触发器 运行 上的更新数据。试试 NEW.solutionscreteria.