sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLの特定のスキーマですべてのオブジェクトの所有権を変更するにはどうすればよいですか?

    ここにいくつかの提案があり(ありがとう)、すべてのオブジェクトの(テーブル/シーケンス/ビュー/関数/集計/タイプ)を変更するためのbashスクリプトを作成するように促されました 一度に特定のスキーマの所有権。スクリプトには特別なコードは含まれていません。基本的に、提案された手法を選択し、スクリプトを介して実装方法を簡略化しました。実際、REASSIGN OWNED BYコマンドはほとんどの作業をスムーズに実行しますが、スキーマに関係なく、データベース全体のオブジェクトの所有権を変更します。 REASSIGN OWNED BYを使用できない2つの不測の事態:

    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もあります。


    1. SQLServerの再構築インデックスクエリ

    2. MySQL Binlogサーバーの探索–リップル

    3. テキスト表現の16進数を10進数に変換します

    4. 大きな(14 GB)MySQLダンプファイルを新しいMySQLデータベースにインポートするにはどうすればよいですか?