首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL :访问其他用户拥有的表

PostgreSQL :访问其他用户拥有的表
EN

Stack Overflow用户
提问于 2017-05-22 20:26:36
回答 1查看 5.2K关注 0票数 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访问所有新视图的方法是什么?

我希望一个用户创建的所有内容都能为另一个用户所访问。

我遵循的步骤是:

代码语言:javascript
运行
复制
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创建的新视图时,会得到以下错误:

代码语言:javascript
运行
复制
ERROR:  permission denied for relation view_name
********** Error **********

ERROR: permission denied for relation view_name
SQL state: 42501
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 20:48:26

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

代码语言:javascript
运行
复制
GRANT read_only_with_create_view_user TO read_write_user; 

更多信息,这里

编辑

它永远不会像你期望的那样起作用。请参见当前的用户架构:

角色read_write_user将不能访问read_only_with_create_view_user拥有的对象,仅仅因为两者没有任何关系。要使它如您所期望的那样工作,您可以将对象所有权重新分配到“高级”角色,在本例中是:read_only_role (因为每个人都是该角色的成员)。但请注意,将不再是的只读角色.

您可以执行以下操作之一:

代码语言:javascript
运行
复制
--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;

或者你可能更喜欢这种方法:

代码语言:javascript
运行
复制
--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拥有的对象的所有权重新分配给您的顶层角色,只需使用一个命令:

代码语言:javascript
运行
复制
REASSIGN OWNED BY read_only_with_create_view_user TO read_only_role;

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

代码语言:javascript
运行
复制
-- 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44121589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档