コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

8.0からはスキーマの権限の詳細が。

http://osb.sra.co.jp/PostgreSQL/8.0/changes.html
8.0から\dn+でスキーマの権限と詳細が確認できるようになったそうです。

test=# \dn+
                                                         スキーマの一覧
        名前        |  所有者  |                         アクセス権             |               説明
                                                                                                                                                                                                                                                              • -
information_schema | postgres | {postgres=UC/postgres,=U/postgres} | pg_catalog | postgres | {postgres=UC/postgres,=U/postgres} | System catalog schema pg_toast | postgres | | Reserved schema for TOAST tables public | postgres | {postgres=UC/postgres,=UC/postgres,testadmin=U*C*/postgres} | Standard public schema (4 行)

7.4系で欲しかった。Red Hat Enterprise Linux 3で8系のパッケージが出てればいいんだけど。

バックアップ

データベース単位でのバックアップは以下の通り。
通常権限の問題等が発生しないようにpostgresユーザで処理した方がよさそう。

pg_dump test -U postgres > test.backup

ただのSQL文が吐き出されるので復元は自由に。
すべてのデータベースというか、ユーザ、グループ等も含めたバックアップは以下のように行う。(通常はこちらでやらないとあまり意味はないかも)

pg_dumpall -U postgres > all.backup
Password:
Password:
Password:

今回はデータベースが3つあったので(たぶん)3回パスワードを聞かれた。
認証がtrust等であれば特にパスワードは求められないと思われる。
取得したファイルは相変わらずただのSQLなので復元は自由に行えばいい。
ただし、上記のいずれの方法でもラージオブジェクトのバックアップは行えない。

権限がわかれば便利便利

testschema作成直後の権限。

 testschema         | testadmin |                                     |

次に、PUBLICの権限をすべて剥奪する。

test=# REVOKE ALL PRIVILEGES ON SCHEMA testschema FROM PUBLIC RESTRICT;

そうすると、デフォルトの権限ではなくなるので以下のようになる。

 testschema         | testadmin | {testadmin=UC/testadmin}            |

そして、testdadminにGRANT OPTIONを付ける。

test=> GRANT ALL PRIVILEGES ON SCHEMA testschema TO testadmin WITH GRANT OPTION;

すると、*が付く。

 testschema         | testadmin | {testadmin=U*C*/testadmin}          |

ちなみに、所有者なので*がなくてもGRANT OPTIONを付与できた(と思う)。
そして、通常のユーザにUSAGE権限を与えてみる。

test=> GRANT USAGE ON SCHEMA testschema TO GROUP testdevs;

すると、権限は以下のように長くなってくる。もちろん*は付いていない。

 testschema         | testadmin | {testadmin=U*C*/testadmin,"group testdevs=U/testadmin"} |

最後に、PUBLICにALL権限を付けてみる。

test=> GRANT ALL PRIVILEGES ON SCHEMA testschema TO PUBLIC;

PUBLICはグループが空で表記されている。

 testschema         | testadmin | {testadmin=U*C*/testadmin,"group testdevs=U/testadmin",=UC/testadmin} |

これが、7.4.6でできたら楽なのに。
ユーザを変えてtestdevsグループのユーザで権限を付与しようとしても、

test=> GRANT USAGE ON SCHEMA testschema TO PUBLIC;
WARNING:  no privileges were granted

のようになりエラーとなってしまう。
逆に、testdevsにUSAGEのGRANT OPTIONを付け、CREATEはGRANT OPTIONなしで権限だけあたえて実行してみると、

test=> GRANT USAGE ON SCHEMA testschema TO PUBLIC;
GRANT
test=> GRANT CREATE ON SCHEMA testschema TO PUBLIC;
WARNING:  no privileges were granted
GRANT

ALLで与えると、一瞬すべて与えられたように思うが、

test=> GRANT ALL PRIVILEGES ON SCHEMA testschema TO PUBLIC;
GRANT

権限を確認するとUの権限しか与えられていない。

=U/namakuwa

ここで、GRANT OPTIONを与えようとしたがうまく行かない。が、お昼休みが終わったので終了。

test=> GRANT USAGE ON SCHEMA testschema TO PUBLIC WITH GRANT OPTION;
ERROR:  grant options can only be granted to individual users

確かに7.4.6では権限は出ない。

会社の8.0.3で\dn+を試したので、家の7.4.6で実験。

test=# \dn+
        List of schemas
        Name        |   Owner
                                                              • -
information_schema | postgres pg_catalog | postgres pg_temp_1 | postgres pg_toast | postgres public | postgres testschema | testadmin (6 rows)

確かに、権限が表示されない。
がっくりですわ。