如何在没有超级用户的情况下查看 pg_stat_activity 中另一个会话的查询?

Ste*_*han 15 postgresql permissions role postgresql-9.2

我有一个 Postgresql 9.2 数据库。在此数据库上创建了两个用户。当我以超级用户身份执行以下查询时,我可以看到所有内容。

select * from pg_stat_activity
Run Code Online (Sandbox Code Playgroud)

但是,是否可以在不以超级用户身份连接的情况下获得相同的结果?

我应该授予/创建哪个权限/角色以获得超级用户可以看到的结果?

Cra*_*ger 25

在这一点上,没有授予的权利,它被硬编码为超级用户。最近在邮件列表中讨论了这一点,如果有人有时间处理它,可能会在 9.5 中更改。

作为一种解决方法,您可以创建一个SECURITY DEFINER由超级用户拥有的函数,并运行您想要的查询。这将允许非超级用户pg_stat_activity通过调用该函数来查看内容。

例如,以超级用户身份运行:

CREATE FUNCTION get_sa() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;

CREATE VIEW pg_stat_activity_allusers AS SELECT * FROM get_sa();

GRANT SELECT ON pg_stat_activity_allusers TO public;
Run Code Online (Sandbox Code Playgroud)

请注意,pg_stat_activity出于某种原因限制了免费访问。可以从其他人的查询中窥探敏感信息 - 例如,假设另一个用户正在使用 pgcrypto。public不应向您授予权限,而应仅向充当监视代理用户的特定用户或角色授予权限。


Rad*_*anu 6

从 PostgreSQL 10 开始,您可以授予角色pg_read_all_stats以实现所需的结果。