他ユーザが所有するオブジェクト(例えばテーブル)にアクセスできるようにするためには、対象のオブジェクトに加えスキーマにも権限付与が必要です。以下は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=>