★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

21.4. ロールの削除

ロールはデータベースオブジェクトを所有したり、他のオブジェクトにアクセスする権限を保持したりできるので、ロールを削除するのは、単にDROP ROLEを実行すれば良いというだけのものでないことがよくあります。 そのロールが所有するすべてのオブジェクトについて、まずそれを削除するか、あるいは他の所有者に移すかしなければなりません。 また、そのロールに付与されたすべての権限を取り上げる必要があります。

オブジェクトの所有権はALTERコマンドを使って、1度に1つずつ移管することができます。 以下に例を示します。

ALTER TABLE bobs_table OWNER TO alice;

その代わりにREASSIGN OWNEDコマンドを使って、削除予定のロールが所有するすべてのオブジェクトの所有権を、単一の他のロールに移管することもできます。 REASSIGN OWNEDは他のデータベースのオブジェクトにはアクセスできないので、そのロールが所有するオブジェクトを含むそれぞれのデータベース内で実行する必要があります。 (最初にそのようなREASSIGN OWNEDを実行した時に、データベース間で共有されるオブジェクト、つまりデータベースとテーブル空間については、すべて削除予定のロールから所有権が変更されることに注意してください。)

重要なオブジェクトがすべて新しい所有者に移管された後は、削除予定のロールが所有する残りのオブジェクトはすべてDROP OWNEDコマンドで削除することができます。 ここでも、このコマンドは他のデータベースのオブジェクトにはアクセスできないので、そのロールが所有するオブジェクトを含むそれぞれのデータベース内で実行する必要があります。 また、DROP OWNEDはデータベース全体、あるいはテーブル空間全体を削除することはありませんので、ロールが所有するデータベースあるいはテーブル空間で新しい所有者に移管されていないものがあれば、手作業でそれを削除する必要があります。

DROP OWNEDは対象のロールが所有しないオブジェクトについて、そのロールに付与されたすべての権限を削除することも行います。 REASSIGN OWNEDはそのようなオブジェクトに関与しないので、削除されるロールによる依存関係を完全に取り除くには、多くの場合、REASSIGN OWNEDDROP OWNEDの両方を(この順序で!)実行する必要があります。

まとめると、オブジェクトを所有するために使用されたロールを削除する最も一般的な手順は以下のようになります。

REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;

-- 上記のコマンドをクラスタ内の各データベースについて繰り返す
DROP ROLE doomed_role;

すべての所有オブジェクトを同一の後継所有者に移管するのでない場合は、例外部分を手作業で処理した後で、上記の手順を実行して残りを処理するのが最善でしょう。

依存するオブジェクトがまだ残っている状態でDROP ROLEを実行すると、どのオブジェクトが所有者変更または削除の必要があるかを特定するメッセージが発行されます。