GRANT USAGE ON SCHEMA 不执行任何操作

GRANT USAGE ON SCHEMA 不执行任何操作

无论出于什么原因,我们的数据库都不遵守 GRANT 命令。下面是一个新创建用户的示例。

pddbtest=> create user test_user login;
CREATE ROLE

然后验证用户是否还没有架构权限

pddbtest=> SELECT rolname, has_schema_privilege(rolname, 'public', 'usage') from pg_roles where rolname='test_user';
  rolname  | has_schema_privilege
-----------+----------------------
 test_user | f
(1 row)

然后授予权限

pddbtest=> grant usage on schema public to test_user;
GRANT

然后读取权限是否存在(不存在)

pddbtest=> SELECT rolname, has_schema_privilege(rolname, 'public', 'usage') from pg_roles where rolname='test_user';
  rolname  | has_schema_privilege
-----------+----------------------
 test_user | f
(1 row)

即使在授予架构权限之后没有返回任何错误,数据库仍然会将权限视为未授予。(如果我之后在架构中的所有表上添加选择授予,则在尝试查询任何表时仍然会收到架构权限被拒绝错误)

(搜索路径为“$user”,如果该信息相关则为公开)

编辑:这是按要求 SELECT version(); 和 \dn+ 的输出:

PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit


                             List of schemas
   Name    |     Owner      |         Access privileges        | Description 
-----------+----------------+----------------------------------+------------------------
 fnrbaks   | appuser_root   |                                  |
 mask      | maint_user_2   | maint_user_2=UC/maint_user_2+    |
           |                | readonly_viewer=U/maint_user_2   | 
 pganalyze | appuser_root   | appuser_root=UC/appuser_root    +| 
           |                | pganalyze=U/appuser_root        +| 
           |                | pganalyze2=U/appuser_root        | 
 public    | rdsadmin       | appuser_root=UC/rdsadmin        +| standard public schema
           |                | proddb=U/rdsadmin                | 
(4 rows)

答案1

public架构在此属于rdsadmin。 GRANT 不起作用的一个可能解释是,它由权限不足的用户(不是rdsadmin超级用户)运行,该用户无权授予 的权限public

grant usage on schema public to test_user;

默认情况下,如果该授权无效,则会显示警告:

WARNING:  no privileges were granted for "public"

但这取决于client_min_messages设置。如果该设置低于警告阈值(例如设置为error),则不会显示警告,并且会出现问题中显示的行为。这可以通过以下方式验证:

 SHOW client_min_messages;

并将其更改为更详细的级别:

SET client_min_messages TO notice;

答案2

我遇到了同样的问题并联系了 AWS 支持;

Template0 所有者是 rdsadmin。您不应使用它来创建新数据库。Template1 所有者是 root(主用户)。您应该使用它来创建新数据库。[...]我们无法将架构所有者改回 rdsadmin,因为它是为 RDS 保留的超级用户。因此,您永远不应使用 template0 来创建数据库。

就我而言,可以通过运行以下命令修复:

alter schema public owner to root;

相关内容