はじめに
にゃーん。趣味でポスグレをやっている者だ。
この記事はPostgreSQL 16 全部ぬこ Advent Calendar 2022 4日目の記事です。
今回は権限を制御するGRANT/REVOKEコマンドのpsqlTAB補完の改善について書きます。
概要
| 項目 | 内容 |
|---|---|
| タイトル | Fix tab completion for GRANT/REVOKE |
| Topic | Clients |
| ステータス | commited |
| Last modified | 2022-11-18 |
| 概要 | GRANT/REVOKEコマンドのTAB補完改善 |
変更内容
GRANT/REVOKEコマンド
GRANT/REVOKEコマンドは大きく分けて2つの機能を持っています。
- PostgreSQLの各種オブジェクトへのアクセス権限を付与/剥奪
- ロールへのメンバ資格を付与/剥奪
詳細はPostgreSQL文書のGRANT/REVOKEを参照してください。
で、PostgreSQL文書を見ていただけると分かるように、とにかく対象のオブジェクトの種類が多い&オブジェクトの種類毎に指定可能な権限が異なるので、とっても覚えにくいです。
自分も何年もぽすぐれ使っているのに、未だにPostgreSQL文書を読みながらでないとGRANT/REVOKEは記述できません・・・
psqlのタブ補完
PostgreSQLをインストールすると利用可能な、PostgreSQLの対話的ターミナルpsqlは、タブ補完機能が充実していることもあって、アドホックにSQL文を書きたいとき重宝しています。
もちろん、従来からGRANT/REVOKE文に対するタブ補完機能はありましたが、PostgreSQLでもタブ補完機能が更に改善されました。
変更内容
GRANTコマンドタグのみの状態
PostgreSQL 15
PostgreSQL 15.0では以下のように補完候補がでてきます。1
=# GRANT
ALL pg_checkpoint pg_signal_backend TEMPORARY
ALTER SYSTEM pg_database_owner pg_stat_scan_tables testdb_owner
CONNECT pg_execute_server_program pg_write_all_data TRIGGER
CREATE pg_monitor pg_write_server_files TRUNCATE
DELETE pg_read_all_data postgres UPDATE
EXECUTE pg_read_all_settings REFERENCES USAGE
GRANT pg_read_all_stats SELECT
INSERT pg_read_server_files SET
=# GRANT
さて、ここで補完されるキーワードに不適切なものが実はあります。
そう、GRANTというキーワードが補完候補として出力されています。
PostgreSQLでは、GRANT GRANT というキーワードの並びは不適切です。たぶん、これは、REVOKEコマンドのみ存在する
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
(以下略)
省略可能なGRANT OPTION FORのGRANTが誤ってGRANTコマンドにも補完候補として現れているのでしょう。
PostgreSQL 16
PostgreSQL 16では、GRANTコマンドタグのみの状態では、GRANTキーワードが補完候補に現れないように改善されました。
=# GRANT
ALL pg_analyze_all_tables pg_read_server_files SELECT
ALTER SYSTEM pg_checkpoint pg_signal_backend SET
ANALYZE pg_database_owner pg_stat_scan_tables TEMPORARY
CONNECT pg_execute_server_program pg_vacuum_all_tables TRIGGER
CREATE pg_monitor pg_write_all_data TRUNCATE
DELETE pg_read_all_data pg_write_server_files UPDATE
EXECUTE pg_read_all_settings postgres USAGE
INSERT pg_read_all_stats REFERENCES VACUUM
=# GRANT
REVOKE<空白>
また、同じパッチ内で、REVOKE<空白>の状態でタブ補完した場合に、GRANT OPTION FORとADMIN OPTION FORキーワード(どちらも省略可能なので普段は意識しないかもしれませんが・・・)が補完される改造が入っていました。
PostgreSQL 15
=# REVOKE
ALL pg_checkpoint pg_signal_backend TEMPORARY
ALTER SYSTEM pg_database_owner pg_stat_scan_tables testdb_owner
CONNECT pg_execute_server_program pg_write_all_data TRIGGER
CREATE pg_monitor pg_write_server_files TRUNCATE
DELETE pg_read_all_data postgres UPDATE
EXECUTE pg_read_all_settings REFERENCES USAGE
GRANT pg_read_all_stats SELECT
INSERT pg_read_server_files SET
=# REVOKE
PostgreSQL 16
=# REVOKE
ADMIN OPTION FOR INHERIT OPTION FOR pg_read_all_stats SELECT
ALL INSERT pg_read_server_files SET
ALTER SYSTEM pg_analyze_all_tables pg_signal_backend TEMPORARY
ANALYZE pg_checkpoint pg_stat_scan_tables TRIGGER
CONNECT pg_database_owner pg_vacuum_all_tables TRUNCATE
CREATE pg_execute_server_program pg_write_all_data UPDATE
DELETE pg_monitor pg_write_server_files USAGE
EXECUTE pg_read_all_data postgres VACUUM
GRANT OPTION FOR pg_read_all_settings REFERENCES
=# REVOKE
他にもあるかもしれないけど
すいません、確認環境を作るのに力尽きたのでこの記事はここまでにします・・・(うまく再現できなかったりして凹んでいる)
補足(ANALYZE/VACUUMキーワードの補完)
この記事のためにGRANT/REVOKEのタブ補完の挙動を調べていて気づいたのですが、1日目の記事(PG16:allow granting VACUUM and ANALYZE privileges on relations)の改善により、psqlのタブ補完にも影響があることに気づきました(GRANT/REVOKEキーワードの直後にタブ補完するとANALYZE/VACUUMキーワードが補完される)。
これについては、1日目の記事に追記しました。
うーん、MLの投稿記事だけでなく、きちんとパッチファイルの中身を確認しないといけないのかな・・・(猫には手に余る・・・)
おわりに
今回はpsqlのタブ補完のちょっとした改善について書いてみました。こういう細かい改善の積み重ねがpsqlの使い勝手の良さにつながっているのでしょうね。
-
この対処がPostgreSQL 15以前の版に反映されるかどうかは未確認です。ある意味Bug-Fixぽいから反映されるのかな? ↩