2015-04-28 78 views
1

是否可以創建在會話結束時自動刪除的觸發器或函數?或者說「當我斷開連接時運行這個SQL」?在PostgreSQL的會話結束時刪除觸發器/函數?

+0

我不這麼認爲。有觸發到數據庫級別,但與其他事件:http://www.postgresql.org/docs/9.3/static/event-trigger-matrix.html你可以描述你的情況?你爲什麼需要這個? –

+1

@ user_0這是可能的 - 請參閱我的答案 – Tometzky

回答

2

在近來的Pos​​tgres的版本,你可以在pg_temp模式創建一個函數:

create function pg_temp.get_true() returns boolean language sql as $$ select true; $$; 
select pg_temp.get_true(); 

這是在其中創建臨時表的模式。其所有內容,包括您的功能,將在會話結束時被刪除。

您還可以在表上使用臨時函數創建觸發器。我剛剛測試了這一點,它按預期工作:

create function pg_temp.ignore_writes() returns trigger language plpgsql as $$ 
    begin 
     return NULL; 
    end; 
$$; 
create table test (id int); 
create trigger test_ignore_writes 
    before insert, update, delete on test 
    for each row execute procedure pg_temp.ignore_writes(); 

因爲這個觸發函數總是返回NULLbefore [event]它應該做的任何寫入此表被忽略。事實上:

insert into test values(1); 
select count(*) from test; 
count 
------- 
    0 

但註銷後,登錄本功能,並觸發將不存在了,所以寫會工作:

insert into test values(1); 
select count(*) from test; 
count 
------- 
    1 

但是你應該知道,這是有點hackish的 - 不經常使用,可能不會被徹底測試。

相關問題