当我们需要从触发程序返回值时?

时间:2017-05-10 14:04:04

标签: 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();

假设some_trigger_function()返回记录/行,我理解在此事件上,在此表上调用并执行过程体,依此类推......但是在哪里返回值这个过程?

问题是:当我们使用该返回值时?为什么我们需要这个价值呢?你能给出一些使用这个返回值的例子/解释吗?

1 个答案:

答案 0 :(得分:1)

阅读the documentation

  

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

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

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

  •   
     

不打算导致其中任何一个的行级BEFORE触发器   这些行为必须小心返回,因为它的结果是同一行   传入的(即INSERT和UPDATE的NEW行)   触发器,DELETE触发器的OLD行)。

     

行级INSTEAD OF触发器应返回NULL以指示   它没有修改视图底层的任何数据   表,或者它应该返回传入的视图行(新的   INSERT和UPDATE操作的行,或DELETE的OLD行   操作)。非空返回值用于表示触发器   在视图中执行必要的数据修改。这将   导致受命令影响的行数的计数   递增。对于INSERT和UPDATE操作,触发器可以修改   返回之前的新行。这将改变返回的数据   INSERT RETURNING或UPDATE RETURNING,在视图显示时很有用   没有显示完全相同的数据。

     

对于在a之后触发的行级触发器,将忽略返回值   操作,所以他们可以返回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)