6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PostgreSQLでテーブルオーナを一括変更する方法

Last updated at Posted at 2017-02-15

PostgreSQLでデータをバックアップファイルからリストアした時、オーナ情報を削除し忘れて、取得元のユーザを引き継いでしまったり、postgresユーザでインポート作業を行ってしまい、オーナが全部postgresになってしまうことがある。

そんな時、あわててデータベースのオーナを変更してもその下に紐付いているテーブルのオーナは変更前のままとなってしまう。
pgadminで変更を試みてもまとめて変更することはできないので、泣く泣く一旦DBを削除してインポート…なんてことは誰でもあるはず。

そんな時、テーブルのオーナを一括変更するコマンドを紹介する。

postgresユーザ以外のユーザから別のユーザへのテーブルオーナ一括変更

一番簡単なのがこのコマンド。コマンド一行で該当ユーザ(old_user)がオーナとなっているテーブルを一括でnew_userに変更する。
このコマンドは個別にテーブル指定を行うことができないので、一括して変更される。
古いユーザを削除して新しいユーザを作り直すときなどに便利。(また、間違えてオーナ情報を設定してリストアした場合も…)

コマンド
--下記のcurrent_userとnew_userをそれぞれ実行環境に応じて置き換える。TOの後ろのユーザ名はダブルコーテーションで囲う事。
REASSIGN OWNED BY current_user TO "new_user";

postgresユーザから別のユーザへのテーブルオーナ変更

先出のコマンドは、postgresユーザから別のユーザへのオーナ変更の際には利用できない。
理由は、一部のシステムテーブルはpostgresユーザからオーナを変更できないものがあり、その変換でエラーとなってしまうから。

そんなときは下記のコマンドで一括変更ができる。
ただし、この方法は一度オーナ変更を行うSQLを自動生成し、それを実行するという2段実行となる。この場合、自動生成されたSQLを自分で取捨選択できるため、オーナ変更を行うテーブルを選択できる。

コマンド
--下記のcurrent_userとnew_userをそれぞれ実行環境に応じて置き換える。
SELECT
    'ALTER TABLE ' || schemaname 
    || '.' || tablename || 
    ' OWNER TO new_user;'  --ここでSQLに記載する新しいオーナを指定
FROM pg_tables 
WHERE tableowner ='old_user' --ここで対象とするテーブルの現在のオーナを指定

上記のコマンドを実行することで、下記のSQLが結果に出力される。出力されたSQLを実行することで、オーナをnew_userに変更することができる。

"ALTER TABLE public.table_name1 OWNER TO new_user;"
"ALTER TABLE public.table_name2 OWNER TO new_user;"
"ALTER TABLE public.table_name3 OWNER TO new_user;"
"ALTER TABLE public.table_name4 OWNER TO new_user;"
"ALTER TABLE public.table_name5 OWNER TO new_user;"
6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?