1

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

该基准日期通过 -v 选项提供给 psql 脚本,例如“-v start_time='2013-10-10 13:48:00'”。

我想从触发函数中访问这个变量,比如:

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

不幸的是,我无法找出正确的语法。有任何想法吗?

4

1 回答 1

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

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

再三考虑,触发器参数化(基于一些全局值)通常是一个糟糕的主意。它表明你做错了。改用函数。

于 2013-10-10T13:54:41.890 回答