PostgreSQL:访问属于另一个用户的表

7
作为超级用户,我在Postgres的同一模式下创建了两个角色:
1. read_only_with_create_view 2. read_write 然后我从每个角色创建了两个用户:
1. read_only_with_create_view_user 2. 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;

使用 read_write_user 登录后,当我尝试访问由 read_only_with_create_view_user 创建的新视图时,出现以下错误:

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

ERROR: permission denied for relation view_name
SQL state: 42501
1个回答

2
您可以将一个角色设置为另一个角色的成员:
GRANT read_only_with_create_view_user TO read_write_user; 

更多信息请点击这里.


编辑

它永远不会按你的期望工作。查看您当前的用户模式:

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;

如果您希望一次性完成所有操作,您可以使用一个命令将由“read_only_with_create_view_user”拥有的对象的所有权重新分配给您的顶级角色:
REASSIGN OWNED BY read_only_with_create_view_user TO read_only_role;

最后,如果您不想打破只读规则,当然也可以直接向对象授予权限。

-- As read_only_with_create_view_user, execute the following:
CREATE VIEW my_view_2 AS SELECT 1;
GRANT SELECT ON my_view_2 TO read_write_user

我已经尝试过使用语法“create role .... in role ....”创建角色,但是read_only_with_create_view_user创建的新视图仍然无法被read_write_user访问。它会显示错误:ERROR: permission denied for relation view_name ********** Error ********** ERROR: permission denied for relation view_name SQL state: 42501 - Himanshu Parmar
你必须展示你的尝试。更新你的问题并附上你输入的命令。 - Michel Milezzi
另外,检查您的角色是否具有INHERIT属性。 - Michel Milezzi
我已经更新了原始问题,包括精确的角色创建和用户创建步骤。 - Himanshu Parmar
感谢Michel的详细解释。 - Himanshu Parmar
如果我错了,请纠正我。如果您将所有权重新分配给“read_only_role”,那么所谓的“只读”角色可以随心所欲地处理该对象,甚至可以删除它。因此,它不再是“只读”角色。那么如何实现对另一个角色/用户拥有的对象的“只读”访问权限? - franta kocourek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接