Возвращаемое из триггерной функции значение для триггера типа AFTER (в PostgreSQL)
Использую СУБД PostgreSQL 13. Видел такой пример создания триггерной функции и соответствующего ей триггера:
create or replace function func_analytic_report_section() returns trigger as
$body$
begin
if (tg_op = 'INSERT') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'I', new.pk, ...);
return new; -- ЭТО ИГНОРИРУЕТСЯ? МОЖНО УБРАТЬ?
elsif (tg_op = 'UPDATE') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'U', new.pk, ...);
return new; -- ЭТО ИГНОРИРУЕТСЯ? МОЖНО УБРАТЬ?
elsif (tg_op = 'DELETE') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'D', old.pk, ...);
return old; -- ЭТО ИГНОРИРУЕТСЯ? МОЖНО УБРАТЬ?
end if;
end;
$body$ language plpgsql;
create trigger t_analytic_report_section
after insert or update or delete
on analytic_report_section
for each row
execute procedure func_analytic_report_section();
Я вроде где-то читал, что если сам триггер является типа AFTER , то у его триггерной функции игнорируется возвращаемое значение. Так ли это? И если это так, то можно ли приведённый выше пример переписать вот так?:
create or replace function func_analytic_report_section() returns trigger as
$body$
begin
if (tg_op = 'INSERT') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'I', new.pk, ...);
elsif (tg_op = 'UPDATE') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'U', new.pk, ...);
elsif (tg_op = 'DELETE') then
insert into ctl_rdg.analytic_report_section_aud(ctl_validfrom, ctl_action, pk, ...)
values (now(), 'D', old.pk, ...);
end if;
return null; -- ДОБАВИЛ !!!
end;
$body$ language plpgsql;
create trigger t_analytic_report_section
after insert or update or delete
on analytic_report_section
for each row
execute procedure func_analytic_report_section();
То есть я в этом примере убрал строки внутри оператора if-then-elsif:
return new;
return new;
return old;
и снаружи этого оператора добавил 1 строку:
return null;
Такой вариант верный? Просто я не понял, зачем возвращать новую/старую строку (new/old), если она игнорируется.
Ответы (1 шт):
The return value of a row-level trigger fired AFTER or a statement-level trigger fired BEFORE or AFTER is always ignored; it might as well be null. However, any of these types of triggers might still abort the entire operation by raising an error.
Так и задокументировано.
Возможно автор вашей триггерной функции предусматривал работу и в качестве before триггера тоже, несколько триггеров могут вызывать одну и ту же триггерную функцию. Ну или просто по аналогии написал так же.