2017-05-10 19 views
2

關於觸發程序的文檔(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

讀入the documentation:按語句觸發器應該總是 返回NULL調用

觸發功能。如果他們選擇 ,由每行觸發器調用的觸發器函數可將 表格行(HeapTuple類型的值)返回給調用執行器。在操作之前觸發行級觸發器具有 以下選擇:

  • 它可以返回NULL來忽略操作當前行。這指示執行程序不執行 調用觸發器(插入,修改或刪除特定錶行)的行級操作。

  • 僅對於行級別的INSERT和UPDATE觸發器,返回的行將成爲將要插入的行,或將替換已更新的行 。這允許觸發器功能修改插入或更新的行爲 。

行級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)  
相關問題