LoginSignup
2
0

More than 1 year has passed since last update.

PG16:Fix tab completion for GRANT/REVOKE

Last updated at Posted at 2022-12-03

はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は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 FORGRANTが誤って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 FORADMIN 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の使い勝手の良さにつながっているのでしょうね。

  1. この対処がPostgreSQL 15以前の版に反映されるかどうかは未確認です。ある意味Bug-Fixぽいから反映されるのかな?

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0