何时需要从触发器过程中返回值?

21

有关触发器程序的文档 (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();
假设some_trigger_function()返回记录/行,我理解在这个事件、表等上调用和执行了过程体,但是这个过程返回值在哪里?
问题是:我们何时使用该返回值?为什么我们需要这个值?你能给出一个小例子/解释吗,其中使用此返回值?
问题是:我们在何时使用这个返回值?我们为什么需要这个值?您可以举个例子或解释一下吗?
1个回答

32

请参阅文档

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

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

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

不打算导致这些行为的行级BEFORE触发器必须小心地将传入的行作为其结果返回(即,对于INSERT和UPDATE触发器,是NEW行,对于DELETE触发器,是OLD行)。

一个行级INSTEAD OF触发器应该返回NULL以指示它没有修改视图的基础表中的任何数据,或者它应该返回传入的视图行(对于INSERT和UPDATE操作是NEW行,对于DELETE操作是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)    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接