43

我需要限制一个用户,只能访问特定的模式表。所以我尝试了以下查询并以 user1_gmail_com 身份登录。但是当我尝试浏览任何模式表时出现以下错误。

我的查询:

SELECT clone_schema('my_application_template_schema','user1_gmail_com');
CREATE USER user1_gmail_com WITH PASSWORD 'myloginpassword';
REVOKE  ALL ON ALL TABLES IN SCHEMA user1_gmail_com FROM PUBLIC;
GRANT SELECT ON ALL TABLES IN SCHEMA user1_gmail_com TO user1_gmail_com;

SQL错误:

ERROR:  permission denied for schema user1_gmail_com at character 46
In statement:
SELECT COUNT(*) AS total FROM (SELECT * FROM "user1_gmail_com"."organisations_table") AS sub

更新的工作查询:

SELECT clone_schema('my_application_template_schema','user1_gmail_com');
CREATE USER user1_gmail_com WITH PASSWORD 'myloginpassword';
REVOKE  ALL ON ALL TABLES IN SCHEMA user1_gmail_com FROM PUBLIC;
GRANT USAGE ON SCHEMA user1_gmail_com TO user1_gmail_com;
GRANT SELECT ON ALL TABLES IN SCHEMA user1_gmail_com TO user1_gmail_com;
4

3 回答 3

80

您不仅需要授予对架构中的表的访问权限,还需要授予对架构本身的访问权限。

手册

默认情况下,用户无法访问他们不拥有的架构中的任何对象。为此,模式的所有者必须授予模式的 USAGE 权限。

因此,要么使您创建的用户成为架构的所有者,要么将架构上的 USAGE 授予该用户。

于 2013-09-27T11:45:23.363 回答
49

这让我很困惑。仍然不确定我是否正确处理它。运行\h grantpsql 中的语法。以下是我设法让其他用户和组根据需要工作的方法:

GRANT ALL PRIVILEGES ON SCHEMA foo TO GROUP bar;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO GROUP bar;
于 2016-02-03T16:02:59.660 回答
1

flyway用于部署数据库更改时,我不断收到此错误。我先做一些手动设置,比如创建数据库,所以 flyway 不需要那些超级管理员权限。

我的修复

我必须确保 flyway 作业使用的数据库用户对公共架构拥有所有权,以便 flyway 用户可以将使用架构的权限分配给其他角色。

其他设置详细信息

我正在使用 AWS RDS(常规和 Aurora),它们不允许数据库中的超级用户。RDS 保留超级用户仅供 AWS 使用,以便消费者无法破坏内置的复制内容。但是,有一个 catch-22,您必须是 postgres 的所有者才能修改它。

我的解决方案是创建一个充当所有者的角色(“所有者角色”),然后将我的管理员用户和 flyway 用户都分配给所有者角色,并ALTER为每个对象使用脚本将对象的所有者分配给所有者角色.

我错过了公共模式,因为它是在我手动创建数据库脚本时自动创建的。公共架构默认为我的管理员角色,而不是共享所有者角色。因此,当 flyway 用户尝试将公共模式权限分配给其他角色时,它没有这样做的权限。但是,在 flyway 执行期间没有引发错误。

于 2019-01-04T20:07:24.273 回答