Sql 使触发器行为依赖于查询
我的目标是使触发器行为依赖于某个客户端标识符 例如,我执行一个查询Sql 使触发器行为依赖于查询,sql,postgresql,Sql,Postgresql,我的目标是使触发器行为依赖于某个客户端标识符 例如,我执行一个查询 begin; <specify-some-client-identifier> insert into some_table values('value') commit; 开始; 插入到某个表中 值(“值”) 犯罪 我在插入之前执行了触发器函数: NEW.some_filed := some_func(<some-client-identifier-spicified-above>) NEW.so
begin;
<specify-some-client-identifier>
insert into some_table
values('value')
commit;
开始;
插入到某个表中
值(“值”)
犯罪
我在插入之前执行了触发器函数:
NEW.some_filed := some_func(<some-client-identifier-spicified-above>)
NEW.some_field:=some_func()
那么,我如何
并获得
?基本上需要SQL中的某种变量。可以通过多种方式实现:
- 使用GUCs
- 使用带变量的表
- 使用带有变量的临时表
- 使用plperl函数中共享的%\u
这一切都是可能的。如果您对实现细节和/或比较感兴趣-请检查此项-以防它在域中不明显-这是我的博客。您基本上需要SQL中的某种变量。可以通过多种方式实现:
- 使用GUCs
- 使用带变量的表
- 使用带有变量的临时表
- 使用plperl函数中共享的%\u
application\u name
GUC,它可以由大多数客户端驱动程序设置,也可以由应用程序显式设置。根据您的目的,这可能就足够了
最后,您可以检查pg\u stat\u activity
,通过pg\u backend\u pid()
查找当前客户机来获取有关该客户机的信息。如果正在使用TCP/IP,这将为您提供客户端IP和端口
当然,如果您在数据库级别以特定用户身份登录,也会有当前用户
像往常一样,@depesz指出了我也没有想到的有用选项——特别是在PL/Perl中使用共享上下文。在PL/Python中也可以做同样的事情。在这两种情况下,您都将支付完整过程语言解释器的启动开销和访问它的函数调用成本,因此,只有在您已经使用PL/Perl或PL/Python的情况下,这样做才有意义。您会发现信息丰富。在这里,我解释了如何传递应用程序定义的用户名,使其对PostgreSQL函数和触发器可见
您还可以使用application\u name
GUC,它可以由大多数客户端驱动程序设置,也可以由应用程序显式设置。根据您的目的,这可能就足够了
最后,您可以检查pg\u stat\u activity
,通过pg\u backend\u pid()
查找当前客户机来获取有关该客户机的信息。如果正在使用TCP/IP,这将为您提供客户端IP和端口
当然,如果您在数据库级别以特定用户身份登录,也会有当前用户
像往常一样,@depesz指出了我也没有想到的有用选项——特别是在PL/Perl中使用共享上下文。在PL/Python中也可以做同样的事情。在这两种情况下,您都将支付完整过程语言解释器的启动开销和访问它的函数调用成本,因此,只有在您已经使用PL/Perl或PL/Python时,这样做才有意义。client identifier??通过此变量,您是否计划为eack客户端(会话)以不同方式进行处理,还是要为不同的-不同的过程添加此变量,在该过程中,此表将得到更新或插入数据?@pratik,我需要区分会话。查询是由客户端生成的。以后请始终指定您的PostgreSQL版本(
SELECT version()
),并尝试提供有关您确切需要的内容的更多信息。在这种情况下,“客户机”和“标识符”并不是您所说的超级信息型。用户名?源IP?某种cookie代码?客户端标识符??通过此变量,您是否计划为eack客户端(会话)以不同方式进行处理,还是要为不同的-不同的过程添加此变量,在该过程中,此表将得到更新或插入数据?@pratik,我需要区分会话。查询是由客户端生成的。以后请始终指定您的PostgreSQL版本(SELECT version()
),并尝试提供有关您确切需要的内容的更多信息。在这种情况下,“客户机”和“标识符”并不是您所说的超级信息型。用户名?源IP?某种cookie代码?