導入: なぜREASSIGN OWNEDが重要なのか
データベース管理の現場において、退職や役割変更に伴うロール(ユーザー)の削除は避けて通れない運用タスクです。しかし、PostgreSQLでは、あるロールがオブジェクト(テーブルやスキーマなど)を所有している状態でそのロールを削除しようとすると、依存関係のエラーが発生して削除できません。個別に所有権を移し替えるのは非常に手間がかかります。そこで役立つのが REASSIGN OWNED コマンドです。本記事では、このコマンドを使って安全かつ効率的に所有権を移行する手順を解説します。
基礎知識: ロールと所有権の仕組み
PostgreSQLにおいて、オブジェクトを作成したロールは自動的にその「所有者(Owner)」となります。所有者は、そのオブジェクトに対する権限の付与や削除、さらにはオブジェクト自体の削除を行う権利を持っています。
REASSIGN OWNED は、指定した古いロール(old_role)が所有するすべてのオブジェクトを、新しいロール(new_role)に一括で譲渡するコマンドです。注意点として、このコマンドは「オブジェクトの所有権」を移すものであり、そのロールに付与されていた「アクセス権限(GRANT)」までは引き継がないという点に留意してください。
実装/解決策: 所有権移行の手順
所有権を移行する際は、以下の論理的な手順を踏むのが安全です。
1. 移行先のロールが既に存在することを確認する。
2. REASSIGN OWNED を実行して所有権を移す。
3. (必要に応じて)DROP OWNED を実行して、残りの権限を整理する。
4. 旧ロールを削除する。
サンプルプログラム: 実践的な移行スクリプト
以下は、momoロールが所有するオブジェクトをsaruロールへ移行するためのSQL例です。
— 1. 現在の所有者(momo)から新しい所有者(saru)へ所有権を移譲する
— このコマンドは、現在のデータベース内にあるmomoが所有する全オブジェクトを対象とします
REASSIGN OWNED BY momo TO saru;
— 2. 所有権の確認(必要に応じて実行)
— スキーマの所有権を確認する
\dn+
— テーブルの所有権を確認する
\dt+
— 3. (補足)権限のクリーンアップ
— もし旧ロール(momo)に対する権限付与も完全に削除したい場合は以下を実行
— DROP OWNED BY momo;
— 4. 旧ロールを安全に削除する
DROP ROLE momo;
応用・注意点: 現場で陥りやすい罠
現場で運用する際、特に注意すべき点が2つあります。
一つ目は、「データベースを跨ぐ操作はできない」という点です。REASSIGN OWNED は実行したデータベース内のオブジェクトしか変更しません。複数のデータベースにまたがってロールがオブジェクトを所有している場合は、それぞれのデータベースに接続して個別に実行する必要があります。
二つ目は、「権限の再設定」です。先述の通り、このコマンドは「誰が所有者か」を書き換えるだけで、ロールに付与されていた「テーブルへのSELECT権限」などは移行されません。旧ロールを削除する前に、新ロールに対して必要な権限が正しく付与されているか、必ず事前の検証を行うようにしてください。これを怠ると、アプリケーションからテーブルへのアクセスができなくなる障害につながる可能性があります。

コメント