有关触发器过程(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()
返回记录/行,我理解在此事件上,在此表上调用并执行过程体,依此类推......但是在哪里返回值这个过程?
问题是:当我们使用该返回值时?为什么我们需要这个价值呢?你能给出一些使用这个返回值的例子/解释吗?
答案 0 :(得分:1)
每个语句触发器调用的触发器函数应始终使用 返回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)