20

有关触发过程的文档(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()返回记录/行,我知道在此事件、此表等上调用并执行过程主体......但是该过程在哪里返回值?

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

4

1 回答 1

29

阅读文档

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

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

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

不打算导致上述任何一种行为的行级 BEFORE 触发器必须小心地返回传入的同一行作为其结果(即,用于 INSERT 和 UPDATE 触发器的 NEW 行,用于 DELETE 触发器的 OLD 行)。

行级 INSTEAD OF 触发器应该返回 NULL 以指示它没有修改视图的基础基表中的任何数据,或者它应该返回传入的视图行(用于 INSERT 和 UPDATE 操作的 NEW 行,或OLD 行用于 DELETE 操作)。非空返回值用于表示触发器在视图中执行了必要的数据修改。这将导致受命令影响的行数的计数增加。对于 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)    
于 2017-05-10T15:11:13.040 回答