讀入the documentation:按語句觸發器應該總是 返回NULL調用
觸發功能。如果他們選擇 ,由每行觸發器調用的觸發器函數可將 表格行(HeapTuple類型的值)返回給調用執行器。在操作之前觸發行級觸發器具有 以下選擇:
行級BEFORE觸發器,它不打算引起任何的 這些行爲必須小心地返回其結果是在(通過同一行 也就是說,新行INSERT和更新 觸發器,DELETE觸發器的舊行)。
行級INSTEAD觸發器要麼返回NULL指示 ,它沒有從視圖的下面的基底修改任何數據 表,或者它應該返回在(對NEW 行傳遞的視圖行INSERT和UPDATE操作,或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)