我正在尝试创建一个触发器函数,以根据存储在变量中的基准日期加上以秒为单位的间隔来创建时间戳。
此基准日期是带有 -v 选项的 psql 脚本的,例如"-v start_time='2013-10-10 13:48:00'"。
我想从触发器函数中访问此变量,如下所示:
NEW.mytimestamp = timestamp :start_time + interval NEW.elapsed_seconds ' s';
不幸的是,我无法找出正确的语法。有什么想法吗?
这是不可能的。 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
另一种(更成熟的(技术是使用辅助表。
再三考虑,触发参数化(基于某些全局值(通常是一个糟糕的主意。这表明你做错了什么。请改用函数。