【问题标题】:PostgreSQL : Accessing tables owned by another userPostgreSQL:访问另一个用户拥有的表
【发布时间】:2017-10-22 15:01:52
【问题描述】:

作为超级用户,我在 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

【问题讨论】:

    标签: postgresql roles owner


    【解决方案1】:

    您可以将一个角色设置为另一个角色的成员:

    GRANT read_only_with_create_view_user TO read_write_user; 
    

    更多信息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_write_user 仍然无法访问由 read_only_with_create_view_user 创建的新视图。它说 ERROR: permission denied for relationship view_name ********** Error ********** ERROR: permission denied for relationship view_name SQL state: 42501
    • 你必须展示你的尝试。使用您发出的命令更新您的问题。
    • 另外,检查你的角色是否有INHERIT属性。
    • 我已经用确切的角色创建和用户创建步骤更新了原始问题
    • 感谢米歇尔的详细解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多