我使用PostgreSQL 13 DBMS 。我看到了创建触发器函数及其相应触发器的示例:
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;
这个选项正确吗?我只是不明白如果忽略它为什么要返回新/旧行。
这是有记录的。
也许您的触发器函数的作者也打算用作之前触发器;多个触发器可以调用相同的触发器函数。好吧,或者简单地类比,我也是这样写的。