2015-04-28 47 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的 - 不经常使用,可能不会被彻底测试。

相关问题