🐘

PostgreSQL 17でのロールに関する変更点

2024/03/20に公開

はじめに

本記事では、PostgreSQL 17でのロールに関する変更点を紹介したいと思います。

PostgreSQL 16のときもロールに関する変更点を調べましたが、かなり多くの変更点がありました。一方で、PostgreQL 17の変更点は少ない印象です。
https://zenn.dev/shinyakato/articles/1a1012c23a2b75

この記事で紹介する機能は正式リリースまでの間に変更となる可能性があることにご注意ください。

動作環境

  • Rocky Linux 9.1
  • PostgreSQL 17devel (f69319f2f1fb16eda4b535bcccec90dff3a6795e)

紹介する機能

  • pg_maintain定義済みロールの追加
  • pg_monitor定義済みロールのメンバはデフォルトでpg_current_logfile()を実行可能に

pg_maintain定義済みロールの追加

この機能はPostgreSQL 16で新機能として一度取り込まれたのですが、権限昇格のバグがあったためRevertされてしまいました。そのバグを修正したうえで改めてPostgreSQL 17に取り込まれることになりました。

pg_maintainを付与すると、全リレーションに対してメンテンス系のコマンド(VACUUM, ANALYZE, REINDEX, REFRESH MATERIALIZE VIEW, CLUSTER, LOCK TABLE)を実行することができるようになります。

pg_maintainのメンバシップをもたない場合
=# CREATE ROLE not_has_pg_maintain ;
CREATE ROLE

=# SET ROLE not_has_pg_maintain ;
SET

=> VACUUM ;
WARNING:  permission denied to vacuum "pg_statistic", skipping it
WARNING:  permission denied to vacuum "pg_type", skipping it
WARNING:  permission denied to vacuum "pg_foreign_table", skipping it
WARNING:  permission denied to vacuum "pg_authid", skipping it
WARNING:  permission denied to vacuum "pg_statistic_ext_data", skipping it
~snip~
WARNING:  permission denied to vacuum "sql_sizing", skipping it
VACUUM
pg_maintainのメンバシップをもつ場合
=# CREATE ROLE has_pg_maintain IN ROLE pg_maintain ;
CREATE ROLE

=> SET ROLE has_pg_maintain ;
SET

=> VACUUM ;
VACUUM

pg_monitor定義済みロールのメンバはデフォルトでpg_current_logfile()を実行可能に

これはタイトルのままですね。

pg_monitorのメンバシップをもたない場合
=# CREATE ROLE not_has_pg_monitor ;
CREATE ROLE

=# SET ROLE not_has_pg_monitor ;
SET

=> SELECT pg_current_logfile() ;
ERROR:  permission denied for function pg_current_logfile
pg_monitorのメンバシップをもつ場合
=# CREATE ROLE has_pg_monitor IN ROLE pg_monitor ;
CREATE ROLE

=> SET ROLE has_pg_monitor ;
SET

=> SELECT pg_current_logfile() ;
          pg_current_logfile          
--------------------------------------
 log/postgresql-2024-03-20_110627.csv
(1 row)

参考

Discussion