2017-05-22 37 views
2

私は同じスキーマのpostgreSqlでスーパーユーザから2つのロールを作成しました。PostgreSQL:別のユーザが所有するテーブルへのアクセス

1))
2をread_only_with_create_viewその後、私はそれぞれの役割から二人のユーザーを作成した

をREAD_WRITE。 (read_only_with_create_view_userとread_write)

read_only_with_create_view_userによって作成された新しいビューは、ビューの所有者が異なるため、read_write_userによってアクセスできません(read_only_with_create_view_user)。

だから、read_write_userによってすべての新しいビューにアクセスする方法は何ですか?

基本的に私が達成しようとしているのは、あるユーザーによって作成されたすべてが別のユーザーがアクセスできるものであることです。

手順私が続く:

CREATE ROLE read_only_role WITH 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity'; 

GRANT CONNECT ON DATABASE mydb to read_only_role; 
GRANT USAGE,CREATE ON SCHEMA myschema TO read_only_role; 
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO read_only_role; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA myschema TO read_only_role; 

CREATE USER read_only_with_create_view_user 
WITH PASSWORD '*****' 
in ROLE read_only_role; 

-- Now created new views using this role. That means read_only_with_create_view_user is owner of those views. 

-- Creating new read-write role. 

CREATE ROLE rw_role WITH 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity' IN ROLE read_only_role; 

GRANT CONNECT ON DATABASE mydb to rw_role; 

GRANT USAGE ON SCHEMA myschema TO crn_rw_role_qa; 
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschema TO rw_role; 
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschema TO rw_role; 

CREATE USER read_write_user 
WITH PASSWORD '*****' 
in role rw_role; 

So after login with read_write_user when I try to access new views created by read_only_with_create_view_user, I get below error 


ERROR: permission denied for relation view_name 
********** Error ********** 

ERROR: permission denied for relation view_name 
SQL state: 42501 

おかげで、
ヒマンシュ

答えて

1

をあなたが別のロールのメンバーとして役割を設定することができます。

GRANT read_only_with_create_view_user TO read_write_user; 

詳細情報here


EDIT

あなたが期待通りに動作しません。

enter image description here

役割read_write_user両方が何らかの関係を持っていないという理由だけでread_only_with_create_view_userが所有するオブジェクトにアクセスすることができないだろう。現在のユーザーのスキーマを参照してください。これを行うには、オブジェクトの所有権を「上位」レベルのロール、つまりread_only_roleに再割り当てする必要があります(誰もがこのロールのメンバーです)。

--Connected as read_only_with_create_view_user 
CREATE VIEW my_view AS SELECT 1; 

--Assign ownership to top-level role 
ALTER VIEW my_view OWNER TO read_only_role; 

をそれとも、このアプローチを好むかもしれない:

次のいずれかを行うことができます。また、もちろん、オブジェクトに直接アクセス許可を与えることができ

--Connected as read_only_with_create_view_user 
--Change current user to read_only_role 
SET role = read_only_role; 

--Create a view... 
CREATE VIEW my_view AS SELECT 1; 

--Turn back to read_only_with_create_view_user 
RESET role; 

CREATE VIEW my_view_2 AS SELECT 1; 
GRANT SELECT ON my_view_2 TO read_write_user 

あなたはただ一つのコマンドではトップレベルの役割にread_only_with_create_view_userが所有するオブジェクトの所有権を再割り当てすることができ、一度にすべてを行うことを好む場合:

REASSIGN OWNED BY read_only_with_create_view_user TO read_only_role; 
+0

役割を作成しながら、私はすでにそのように試してみました"create role .... in role ...."という構文では、read_only_with_create_view_userによって作成された新しいビューにはread_write_userによってアクセスできません。 ERROR:関係view_nameの権限が拒否されました。 ***************************** エラー:関係ビュー名に対する権限が拒否されています SQLの状態:42501 –

+0

試み。質問をあなたが発行したコマンドで更新してください。 –

+0

また、ロールに 'INHERIT'属性があるかどうかを確認してください。 –

関連する問題