0

我的目标是使触发行为依赖于某些客户端标识符。

例如我执行一个查询

begin;
<specify-some-client-identifier>
insert into some_table
values('value')
commit;

我在插入之前执行了触发功能:

NEW.some_filed := some_func(<some-client-identifier-spicified-above>)

那么,我该如何<specify-some-client-identifier>获得<some-client-identifier-spicified-above>

4

2 回答 2

2

您基本上需要 SQL 中的某种变量。可以通过多种方式做到这一点:

  • 使用 GUC
  • 使用带变量的表
  • 使用带有变量的临时表
  • 在 plperl 函数中使用 %_SHARED

这一切都是可能的。如果您对实现细节和/或比较感兴趣 - 请查看这篇博文- 以防它在域中不明显 - 这是我的博客。

于 2013-06-28T08:55:32.033 回答
2

您会发现此先前的答案提供了丰富的信息。在那里,我解释了如何传递应用程序定义的用户名,以便 PostgreSQL 函数和触发器可以看到它。

您还可以使用application_nameGUC,它可以由大多数客户端驱动程序设置或由应用程序显式设置。根据您的目的,这可能就足够了。

最后,您可以通过查找来检查pg_stat_activity以获取有关当前客户端的信息pg_backend_pid()。如果使用 TCP/IP,这将为您提供客户端 IP 和端口。

当然,current_user如果您在数据库级别以特定用户身份登录也是如此。

像往常一样,@depesz 也指出了我没有想到的有用选项——尤其是在 PL/Perl 中使用共享上下文。你可以在 PL/Python 中做同样的事情。在这两种情况下,您都将支付完整的过程语言解释器的启动开销和访问它的函数调用成本,因此只有在您已经在使用 PL/Perl 或 PL/Python 时这样做才有意义。

于 2013-06-28T10:01:44.817 回答