哪个 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 AUTHORIZATION
或SET 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登录用户数据存储到会话中