我正在尝试创建一个触发器函数,根据存储在变量中的基准日期加上以秒为单位的间隔来创建时间戳。
这个基准日期是带有-v选项的psql脚本,例如: “-v start_time ='2013-10-10 13:48:00'”。
我想从触发器函数中访问此变量,执行以下操作:
NEW.mytimestamp = timestamp :start_time + interval NEW.elapsed_seconds ' s';
不幸的是我无法弄清楚正确的语法。有什么想法吗?
答案 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
另一种(更成熟的)技术是使用辅助表。
第二个想法,触发参数化(基于一些全局值)通常是一个可怕的想法。它表明你做错了。改为使用函数。