1。ユーザーが誤ってすべてのオブジェクトをsuper-user(postgres)で作成し、後で他のユーザーに変更しようとすると、REASSIGN OWNED BYは機能せず、次のようにエラーが発生します。
postgres=# reassign owned by postgres to user1;
ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system
2。ユーザーが1つのスキーマオブジェクトの所有権のみを変更したい場合。
「postgres」ユーザーから他のユーザーにオブジェクトを変更する場合、または1つのスキーマオブジェクトのみを変更する場合は、pg_catalogとinformation_schemaからオブジェクトの詳細を収集し、 ALTER TABLE / FUNCTION / AGGREGATE / TYPEを呼び出して、各オブジェクトをループする必要があります。 など
OSコマンド(sed / egrep)を使用してpg_dump出力を微調整する手法が好きでした。なぜなら、pg_dumpは本質的にすべてのオブジェクトのALTER .. OWNER TO( TABLES / SEQUENCES / VIEWS / FUNCTIONS / AGGREGATES / TYPES )その出力で。新しいUSER/SCHEMANAMEをsedに置き換えてpg_dumpstdoutからこれらのステートメントをgrepし、それらのステートメントをpsqlクライアントに返すと、Postgresユーザーが所有するオブジェクトであっても問題が修正されます。スクリプトで同じアプローチを使用し、ユーザーがNEW USERNAMEとSCHEMANAMEを渡すことを許可したので、ALTER…OWNERTO..ステートメントで置き換えます。
スクリプトの使用法と出力:
sh change_owner.sh -n new_rolename -S schema_name
-bash-4.1$ sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
ここからスクリプトをダウンロードできます。また、使用法について役立つREADMEもあります。