Возвращаемое из триггерной функции значение для триггера типа 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 триггера тоже, несколько триггеров могут вызывать одну и ту же триггерную функцию. Ну или просто по аналогии написал так же.

→ Ссылка