访问触发器函数内的变量

时间:2013-10-10 11:54:11

标签: postgresql triggers global-variables

我正在尝试创建一个触发器函数,根据存储在变量中的基准日期加上以秒为单位的间隔来创建时间戳。

这个基准日期是带有-v选项的psql脚本,例如: “-v start_time ='2013-10-10 13:48:00'”。

我想从触发器函数中访问此变量,执行以下操作:

NEW.mytimestamp = timestamp :start_time + interval NEW.elapsed_seconds ' s';

不幸的是我无法弄清楚正确的语法。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这是不可能的。 psql变量(通过:varname访问)是客户端变量。触发器功能在服务器上执行,无法访问这些变量。

有一种解决方法,但有点困难(不能通过命令行简单地初始化值)。您可以使用自定义配置设置变量:

postgres=# select set_config('public.xxx', '10', false);
 set_config 
------------
 10
(1 row)

create or replace function foo_trg()
returns trigger as $$
begin
  raise notice '%', current_setting('public.xxx');
  return new;
end;
$$ language plpgsql;

create table foo(a int);

create trigger hh before insert on foo for each row execute procedure foo_trg();

postgres=# insert into foo values(200);
NOTICE:  10
INSERT 0 1

另一种(更成熟的)技术是使用辅助表。

第二个想法,触发参数化(基于一些全局值)通常是一个可怕的想法。它表明你做错了。改为使用函数。