ロールはデータベースオブジェクトを所有したり、他のオブジェクトにアクセスする権限を保持したりできるので、ロールを削除するのは、単にDROP ROLE
を実行すれば良いというだけのものでないことがよくあります。
そのロールが所有するすべてのオブジェクトについて、まずそれを削除するか、あるいは他の所有者に移すかしなければなりません。
また、そのロールに付与されたすべての権限を取り上げる必要があります。
オブジェクトの所有権はALTER
コマンドを使って、1度に1つずつ移管することができます。
以下に例を示します。
ALTER TABLE bobs_table OWNER TO alice;
その代わりにREASSIGN OWNED
コマンドを使って、削除予定のロールが所有するすべてのオブジェクトの所有権を、単一の他のロールに移管することもできます。
REASSIGN OWNED
は他のデータベースのオブジェクトにはアクセスできないので、そのロールが所有するオブジェクトを含むそれぞれのデータベース内で実行する必要があります。
(最初にそのようなREASSIGN OWNED
を実行した時に、データベース間で共有されるオブジェクト、つまりデータベースとテーブル空間については、すべて削除予定のロールから所有権が変更されることに注意してください。)
重要なオブジェクトがすべて新しい所有者に移管された後は、削除予定のロールが所有する残りのオブジェクトはすべてDROP OWNED
commandコマンドで削除することができます。
ここでも、このコマンドは他のデータベースのオブジェクトにはアクセスできないので、そのロールが所有するオブジェクトを含むそれぞれのデータベース内で実行する必要があります。
また、DROP OWNED
はデータベース全体、あるいはテーブル空間全体を削除することはありませんので、ロールが所有するデータベースあるいはテーブル空間で新しい所有者に移管されていないものがあれば、手作業でそれを削除する必要があります。
DROP OWNED
は対象のロールが所有しないオブジェクトについて、そのロールに付与されたすべての権限を削除することも行います。
REASSIGN OWNED
はそのようなオブジェクトに関与しないので、削除されるロールによる依存関係を完全に取り除くには、多くの場合、REASSIGN OWNED
とDROP OWNED
の両方を(この順序で!)実行する必要があります。
まとめると、オブジェクトを所有するために使用されたロールを削除する最も一般的な手順は以下のようになります。
REASSIGN OWNED BY doomed_role TO successor_role; DROP OWNED BY doomed_role; -- 上記のコマンドをクラスタ内の各データベースについて繰り返す DROP ROLE doomed_role;
すべての所有オブジェクトを同一の後継所有者に移管するのでない場合は、例外部分を手作業で処理した後で、上記の手順を実行して残りを処理するのが最善でしょう。
依存するオブジェクトがまだ残っている状態でDROP ROLE
を実行すると、どのオブジェクトが所有者変更または削除の必要があるかを特定するメッセージが発行されます。