错误:对于字符46处的架构user1_gmail_com,权限被拒绝

时间:2013-09-27 07:31:00

标签: postgresql

我需要限制用户,只能访问特定的模式表。所以我尝试了以下查询并以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;

3 个答案:

答案 0 :(得分:63)

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

来自manual

  

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

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

答案 1 :(得分:33)

这让我很困惑。仍然不确定我是否正确处理它。运行\h grant以获取psql中的语法。以下是我设法让我的其他用户和群组按需工作的方式:

GRANT ALL PRIVILEGES ON SCHEMA foo TO GROUP bar;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO GROUP bar;

答案 2 :(得分:0)

使用flyway部署数据库更改时,我一直收到此错误。首先,我会进行一些手动设置,例如创建数据库,因此flyway不需要那些超级管理员权限。

我的修正

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

其他设置详细信息

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

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

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