什么时候需要触发程序的返回值?

roy*_*gan 9 database postgresql triggers postgresql-9.6

有关触发过程的文档(https://www.postgresql.org/docs/9.6/static/plpgsql-trigger.html)表示:“触发函数必须返回NULL或记录/行”。

CREATE TRIGGER my_trigger
AFTER INSERT ON table_name
FOR EACH ROW EXECUTE PROCEDURE some_trigger_function();
Run Code Online (Sandbox Code Playgroud)

假设some_trigger_function()返回记录/行,我知道在此事件,此表等上调用并执行了过程主体,等等……但是该过程在哪里返回值?

问题是:何时使用该返回值?为什么我们需要这个值?您能否举一些使用此返回值的示例/说明?

kli*_*lin 11

阅读文档

每个语句触发器调用的触发器函数应始终返回NULL。按行触发器调用的触发器函数(如果选择)可以将表行(HeapTuple类型的值)返回给执行者。在操作之前触发的行级触发器具有以下选择:

  • 它可以返回NULL以跳过当前行的操作。这指示执行程序不要执行调用触发器的行级操作(特定表行的插入,修改或删除)。

  • 仅对于行级INSERT和UPDATE触发器,返回的行成为将要插入的行或将替换要更新的行。这允许触发器功能修改要插入或更新的行。

不打算引起上述任何一种行为的行级BEFORE触发器必须谨慎返回其结果,即返回传入的同一行(即INSERT和UPDATE触发器为NEW行,DELETE触发器为OLD行)。

行级INSTEAD OF触发器应返回NULL以指示它没有修改视图基础表的任何数据,或者应返回传入的视图行(INSERT和UPDATE操作的NEW行,或用于删除操作的OLD行)。非空返回值用于表示触发器在视图中执行了必要的数据修改。这将导致该命令影响的行数计数增加。对于INSERT和UPDATE操作,触发器可以在返回之前修改NEW行。这将更改INSERT RETURNING或UPDATE RETURNING返回的数据,并且在视图将不完全显示所提供的相同数据时很有用。

对于操作后触发的行级触发器,返回值将被忽略,因此它们可以返回NULL。

下面的示例显示如何有条件地中止触发器中的插入:

create table my_table(id int);

-- do not insert rows with id > 10
create or replace function before_insert_on_my_table()
returns trigger language plpgsql as $$
begin
    return case
        when new.id > 10 then null
        else new
    end;
end $$;

create trigger before_insert_on_my_table
before insert on my_table
for each row execute procedure before_insert_on_my_table();

insert into my_table
values (15), (10), (5), (20)
returning id;

 id 
----
 10
  5
(2 rows)    
Run Code Online (Sandbox Code Playgroud)