haiju's 開発メモ

開発に必要な情報を自分用にメモ

PostgreSQLでError: `cannot be dropped because some objects depend on it`が発生する場合

PostgreSQL10を開発環境で利用していて、有志が作成したCREATEと

DROPを利用したDatabaseを作成/再作成するスクリプトを実行した時に、

タイトルのエラーが発生し、気になるので調べてみたことをメモして

おく(Φω|

PostgreSQLではMySQLとは違い、単純にロールを削除するのに

DROPコマンドだけを使用するのは問題があるらしい。

(MySQLについて詳しく調べてないので語弊があるかも)

ちなみに、PostgreSQLで言うところのロールとは一般的に(MySQLとか

他のDatabase?)ユーザやグループと呼ばれるものの2つの性質を持って

いるらしい。だいたい、PostgreSQLではロール=ユーザって思って

おけば大丈夫っぽい。

また、ロール(ユーザ)を削除する場合、最低、以下のプロセスを踏む必要が

あるとのこと。(以下のロールは適宜ユーザに読み替える)

[ロール削除前に必要な手順]

1. ロールが所有するデータベースオブジェクトを削除するか所有者を

 変更しておく。

2. データベースオブジェクトに対する権限をロールが持っている場合は、

 権限もすべて削除しておく。

[ロール削除に必要な要件]

1. 対象のロールがスーパーユーザーの場合はコマンドを実行するロール

 がスーパーユーザーである必要がある。

2. それ以外のロールを削除するにはコマンドを実行するロールが

 CREATEROLE 権限を持っている必要がある。

[以上を踏まえたロール削除手順]

1. Database(PostgreSQL)に接続。

2. ロールが所有するデータベースオブジェクトを削除する or 所有者

 を変更。

(ex)データベースオブジェクトを削除

DROP OWNED BY ROLENAME

(ex)データベースオブジェクトの所有者を変更

REASSIGN OWNED BY ROLENAME TO <newuser>

3. データベースオブジェクトに対する権限をロールが所持している場合、

 権限も全て削除。

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ROLENAME

REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ROLENAME

REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ROLENAME

4. ユーザを削除。

DROP USER ROLENAME

MySQLと文化が違いすぎるーw

 もっと勉強せねばだ(ΦωΦ;;

[参考サイト]

stackoverflow.com

stackoverflow.com

dba.stackexchange.com

www.postgresql.org

www.postgresql.org

www.postgresql.org

www.flyenginer.com

www.postgresql.jp

www.postgresql.jp

www.dbonline.jp

www.dbonline.jp

www.dbonline.jp

www.dbonline.jp

www.dbonline.jp

stackoverflow.com