在PostgreSQL会话结束时删除触发器/功能?

时间:2015-04-28 17:30:49

标签: postgresql

是否可以创建在会话结束时自动删除的触发器或函数?或者说"当我断开"?

时运行这个SQL

1 个答案:

答案 0 :(得分:3)

在最近的Postgres版本中,您可以在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();

因为此触发器函数始终返回NULL并且是before [event],所以它应该忽略对该表​​的任何写入。事实上:

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

但是在注销并登录后,此功能和触发器将不再存在,因此写入将起作用:

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

但是你应该知道这有点过时 - 不经常使用,也可能没有经过彻底的测试。