触发行为取决于查询

时间:2013-06-28 08:49:10

标签: sql postgresql

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

例如,我执行查询

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>

2 个答案:

答案 0 :(得分:2)

你基本上需要在SQL中使用某种变量。可以通过多种方式实现它:

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

这一切都是可能的。如果您对实施细节和/或比较感兴趣 - 请查看此blogpost - 以防万一从域中显而易见 - 这是我的博客。

答案 1 :(得分:2)

您会发现this prior answer信息丰富。在那里,我解释了如何传递应用程序定义的用户名,以便它对PostgreSQL函数和触发器可见。

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

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

当然,如果您在数据库级别以特定用户身份登录,那么还会current_user

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