哪个 postgres 系统表存储 PID 到会话授权的映射?

Posted

技术标签:

【中文标题】哪个 postgres 系统表存储 PID 到会话授权的映射?【英文标题】:Which postgres system table stores a map of PIDs to session authorizations? 【发布时间】:2013-12-13 01:43:52 【问题描述】:

我想进一步查看pg_stat_activity 中列出的 PID,以了解他们对SET SESSION AUTHORIZATION 的最后一次成功调用将他们的会话授权设置为什么。在 PostgreSQL 9.0 上我需要哪个表或视图?

【问题讨论】:

我不认为有任何这样的记录暴露;您可以在pg_stat_activity 中看到登录会话用户,但看不到任何会话或角色假定用户。至少在我的 9.3 上。也许这值得在 pgsql-general 邮件列表中提出?如果我们可以在不对性能造成过度影响的情况下通过 p.s.a 公开,这可能是一个很好的信息。 ... 所以你必须使用日志,记录会话 ID 和 pid。不好玩。 @CraigRinger,哦,出于某种原因,我假设每个最后一个变量都以某种方式存储在表中。 :) 好吧,如果你想这样添加它,你的答案是有效的...... 【参考方案1】:

PostgreSQL 不会公开这些信息,至少在 9.4 或任何之前的版本中是这样。

pg_stat_activity中的用户id是登录用户;是RESET SESSION AUTHORIZATION 返回的用户。当你SET SESSION AUTHORIZATIONSET ROLE 时它不会改变。

有关当前有效会话授权和当前角色的信息在后端内部。您可以使用SELECT current_user, current_role 等在本地访问它们到后端,但是没有进程间的方式来获取它们。

如果可以添加它而不会增加维护pg_stat_activity 或查询它的成本,那么拥有它可能会很好。不过,您需要深入了解 PostgreSQL 并开发一个补丁来公开信息。

令人惊讶的是,log_line_prefix 似乎没有包含格式符号来显示有效角色和有效会话用户。鉴于 PgBouncer 使用会话授权,这很奇怪,我觉得我一定错过了一些东西。

无论如何,我认为这样做的唯一方法是挖掘日志、记录 pid 和会话 ID,然后将成功的 SET SESSION AUTHORIZATION 调用与后续语句相关联。

【讨论】:

以上是关于哪个 postgres 系统表存储 PID 到会话授权的映射?的主要内容,如果未能解决你的问题,请参考以下文章

从数据库获取数据值以保存到会话存储?

使用带有codeigniter的google api将google登录用户数据存储到会话中

Laravel 5.6,使多页注册并将输入数据保存到会话

Passport.js:无法将用户序列化到会话中(已经添加了序列化代码)?

django:将查询集保存到会话

我想要一个将表单保存到会话的按钮