PostgreSQL

PostgreSQL permission denied for schema 発生時の対応方法

他ユーザが所有するオブジェクト(例えばテーブル)にアクセスできるようにするためには、対象のオブジェクトに加えスキーマにも権限付与が必要です。以下はsooniスキーマに存在する所有者sooniのex02テーブルに対し、online_userからアクセスしたら permission denied が発生した状況です。

-- sooniにて実行(online_userにex02テーブルへのselect,insert権限を付与)
myposdb=> grant select,insert on ex02 to online_user
myposdb=> ;
-- online_userにて実行
myposdb=> select * from sooni.ex02;
ERROR:  permission denied for schema sooni
LINE 1: select * from sooni.ex02;
                      ^
myposdb=>
-- こちらは(postgresql.confの)lc_messages = 'ja_JP.UTF-8'に変更し
-- 出力メッセージを日本語にしたケースです
--
myposdb=> select * from sooni.ex02;
ERROR:  スキーマ sooni へのアクセスが拒否されました
行 1: select * from sooni.ex02;

myposdb=>

このエラーを対策するにはsooniユーザにてさらに grant usage on schema と権限付与も必要になります。

GRANT usage ON schema sooni TO online_user
;
-- sooniにて実行
myposdb=> GRANT usage ON schema sooni TO online_user
myposdb=> ;
-- online_userにて再度確認
myposdb=> select * from sooni.ex02;
 rid | name  |    kanji
-----+-------+--------------
  10 | sooni | 山田スーニー
  20 | zooni | 織田ズーニー
(2 rows)


myposdb=>

参考までにですが、usage権限をonline_userに付与しただけで、select権限を付与していない場合はpermission denied for table エラーが発生し、テーブル自体存在しない場合はdoes not exist エラーが発生します。

myposdb=> select * from sooni.ex02;
ERROR:  permission denied for table ex02
myposdb=> select * from sooni.testtable
myposdb-> ;
ERROR:  relation "sooni.testtable" does not exist
LINE 1: select * from sooni.testtable
                      ^
myposdb=>
-- こちらは(postgresql.confの)lc_messages = 'ja_JP.UTF-8'に変更し
-- 出力メッセージを日本語にしたケースです
--
myposdb=> select * from sooni.ex02;
ERROR:  スキーマ sooni へのアクセスが拒否されました
行 1: select * from sooni.ex02;
                    ^
myposdb=> select * from sooni.ex02;
ERROR:  テーブル ex02 へのアクセスが拒否されました
myposdb=> select * from sooni.testtable;
ERROR:  リレーション"sooni.testtable"は存在しません
行 1: select * from sooni.testtable;
                    ^
myposdb=>
スポンサーリンク