ただの備忘録。別にPostgreSQLに詳しいわけではない。
やったこと
pg_dump -d <hoge> -Ft
でPostgreSQLのバックアップを取得
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のドキュメントには記載があった。
困ったときはググるまえに公式ドキュメントをちゃんと読んだ方がよい。