PosgtreSQLをpg_restore -c でリストアするとスキーマの権限が正しくリストアされない話

ただの備忘録。別にPostgreSQLに詳しいわけではない。

やったこと

pg_dump -d <hoge> -FtPostgreSQLのバックアップを取得 pg_restore -c -F t -d <hoge>PostgreSQLをリストアしようとした。

起こったこと

postgresのスキーマ(PUBLIC)に権限(privilages)がリストアされない。 -cもとい--cleanオプションを付けてprivilagesを削除しているので、リストアされたスキーマはprivilagesがない形になる。

スキーマのprivilegesがバックアップ前後で以下のように変わる*1

バックアップ前

全ロールにUSAGEとCREATEが付与されていた。

  name  |  owner   |  access privileges   |      description
--------+----------+----------------------+------------------------
 public | postgres | postgres=uc/postgres+| standard public schema
        |          | =uc/postgres         |

バックアップ後

一切の権限が付与されていない。

   Name  |  Owner   | Access privileges |      Description
 --------+----------+-------------------+------------------------
  public | postgres |                   | standard public schema

このためpostgresユーザ以外はスキーマへのアクセスができなくなる。 実際にはテーブル一覧を表示できなくなったり、スキーマ名を省略できなくなる。

オブジェクトへの権限がついていれば、明示的にスキーマを指定すればオブジェクトへアクセスはできるよう。 (schema.tablenameのように指定する)

なお、PUBLIC以外のスキーマで起こるかは未確認。

原因

詳細は不明なのだが、おそらくPostgreSQLバグ。

PostgreSQL: Re: BUG #14788: `pg_restore -c` won't restore schema access privileges.を参照すると同じような事象が報告されている。

上記では9.6.4だが、まだfixされているわけではないのだろう。

暫定対処

schemaに手動でGRANTする。PUBLICスキーマなら以下。

GRANT ALL ON SCHEMA public TO PUBLIC

その他

\dn+のアクセス権限の読み方が分からなかった。コマンド名で調べても情報がないが、ちゃんと大本のGRANTのドキュメントには記載があった。 困ったときはググるまえに公式ドキュメントをちゃんと読んだ方がよい。

*1:後述するメーリングリストからの引用