阅读文档:
每个语句触发器调用的触发器函数应始终返回 NULL。每行触发器调用的触发器函数可以将表行(HeapTuple 类型的值)返回给调用执行程序,如果他们选择的话。在操作之前触发的行级触发器有以下选择:
不打算导致上述任何一种行为的行级 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)