Postgresql 9.2データベースがあります。このデータベースに2人のユーザーが作成されます。次のクエリをスーパーユーザーとして実行すると、すべてが表示されます。
select * from pg_stat_activity
しかし、スーパーユーザーとして接続しなくても同じ結果を達成することは可能ですか?
スーパーユーザーが表示できる結果を得るためには、どの特権/役割を付与/作成する必要がありますか?
この時点では、付与する権利はなく、スーパーユーザーにハードコードされています。これは最近メーリングリストで議論されており、誰かがそれに取り組む時間を見つけた場合、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;
pg_stat_activity
への無料アクセスは、理由により制限されています。他の人のクエリから機密情報を覗き見することが可能です-たとえば、別のユーザーがpgcryptoを使用していた場合を想像してみてください。 public
に権限を付与するのではなく、監視の代理ユーザーとして機能する特定のユーザーまたはロールにのみ権限を付与する必要があります。
PostgreSQL 10以降では、目的の結果を達成するために、ロールpg_read_all_stats
を付与できます。