在 "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".name
的 salesprofile
table 行设置 department
列(通过修改 NEW.department = ...
).
我得到的行为:
select
语句非常好并且按预期工作(按原样调用时,在函数外部)。
当我第一次更新 salesprofile
行时,触发器将 department
列设置为 NULL
(该列不会在全部);
当我对 salesprofile
行进行第二次更新时,触发器将 department
列设置为我在第一次更新时尝试设置的值;
当我对 salesprofile
行进行第三次更新时,触发器将 department
列设置为我在第二次更新时尝试设置的值;
等等...
如果我将不正确的值放入salesprofile.solutionscreteria #>> '{departments, 0}'
值,第一次触发更新不会导致任何错误。
然后如果我之后设置了正确的值,触发器将触发并出现错误(由前一个触发器调用的值不正确引起)。
我不明白这是怎么发生的以及为什么会发生,我希望我能以一种易于理解的方式解释这种行为。
这是 potgresql 触发器的预期行为吗?如果没有,那么您能否解释一下发生了什么以及如何使其正常工作?
它是一个 BEFORE
触发器,因此它发生在 salesprofile
table 具有 NEW
数据之前。我并不完全遵循,但我要说的是 salesprofile.solutionscreteria #>> '{departments, 0}'
使用的是现有(上一个)行,而不是触发器 运行 上的更新数据。试试 NEW.solutionscreteria
.
我正在尝试为 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".name
的 salesprofile
table 行设置 department
列(通过修改 NEW.department = ...
).
我得到的行为:
select
语句非常好并且按预期工作(按原样调用时,在函数外部)。当我第一次更新
salesprofile
行时,触发器将department
列设置为NULL
(该列不会在全部);当我对
salesprofile
行进行第二次更新时,触发器将department
列设置为我在第一次更新时尝试设置的值;当我对
salesprofile
行进行第三次更新时,触发器将department
列设置为我在第二次更新时尝试设置的值;等等...
如果我将不正确的值放入
salesprofile.solutionscreteria #>> '{departments, 0}'
值,第一次触发更新不会导致任何错误。然后如果我之后设置了正确的值,触发器将触发并出现错误(由前一个触发器调用的值不正确引起)。
我不明白这是怎么发生的以及为什么会发生,我希望我能以一种易于理解的方式解释这种行为。
这是 potgresql 触发器的预期行为吗?如果没有,那么您能否解释一下发生了什么以及如何使其正常工作?
它是一个 BEFORE
触发器,因此它发生在 salesprofile
table 具有 NEW
数据之前。我并不完全遵循,但我要说的是 salesprofile.solutionscreteria #>> '{departments, 0}'
使用的是现有(上一个)行,而不是触发器 运行 上的更新数据。试试 NEW.solutionscreteria
.