跳至内容

如何授予对 Amazon Redshift 中新创建的对象的权限?

2 分钟阅读
0

我的用户收到了对新创建对象的权限被拒绝错误。如何向用户授予访问架构中新创建的对象所需的权限?

简短描述

想要访问架构中新创建的对象的用户必须具有对象所有者或超级用户授予的访问权限。

当用户无法访问架构中新创建的对象时,他们可能会收到以下错误:

“错误:关系 'objectname' 的权限被拒绝”

在首次授予访问权限时,如果仅授予对架构中存在的对象的访问权限,则会发生此错误。默认情况下,不会自动授予对在当前架构下创建的对象的访问权限。

要解决此问题,请向用户授予访问权限或通过组角色授予访问权限。使用 ALTER DEFAULT PRIVILEGES 命令。

解决方法

要授予对架构中的当前表和后续表的权限,请以超级用户身份执行以下操作:

  1. 要授予对架构的使用权限,以及对架构下当前存在的所有表的 SELECT 权限,请运行以下命令:
    **注意:**请将 newtestschema 替换为您的架构名称,将 newtestuser 替换为用户的名称。

    grant usage on schema newtestschema to newtestuser;
    grant select on all tables in schema newtestschema to newtestuser;
  2. 要向用户授予对在架构下创建的后续表的 SELECT 权限,请运行以下命令:
    **注意:**请将 awsuser 替换为将用于在架构下创建后续对象的用户名。然后,将 newtestschema 替换为架构名称,将 newtestuser 替换为需要访问后续对象的用户名。

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    **注意:**默认权限仅适用于新对象。当运行 ALTER DEFAULT PRIVILEGES 命令时,对现有对象的权限不会更改。

  3. 要验证是否向用户授予了默认权限,请以超级用户身份运行以下查询:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    要查看直接授予用户的权限,请以超级用户身份运行以下查询:

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

示例解决方法

以下示例将使用如下配置:

  • 一个名为 newtestuser 且不是超级用户的用户。
  • 一个名为 newtestschema 的架构和该架构下一个名为 newtesttable1 的表,以及一些记录。

名为 awsuser 的超级用户将向 newtestuser 授予对 newtestschema 架构以及对该架构下当前存在的所有表的访问权限。要授予访问权限,awsuser 将使用以下示例命令:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

该命令将授予 newtestusernewtestschema 下存在的当前表的 SELECT 权限。目前,newtestschema 下仅存在 newtesttable1 表。因此,newtestuser 可以访问 newtesttable1 表。

接下来,awsuser 将在 newtestschema 下创建另一个名为 newtesttable2 的表。如果 newtestusernewtestschema.newtesttable2 表运行 SELECT 查询,则会出现以下错误:

ERROR: permission denied for relation newtesttable2.

为解决此错误,awsuser 将执行以下步骤:

  1. 授予对 newtesttable2 表的访问权限。为此,awsuser 将运行以下示例命令:

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. newtestuser 授予对 awsusernewtestschema 下创建的任何后续表的访问权限。为此,awsuser 将运行以下示例命令:

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    现在,当 awsusernewtestschema 下创建另一个名为 newtesttable3 的新表时,newtestuser 将具有对 newtesttable3SELECT 权限。

  3. 要检查是否向 newtestuser 授予了默认权限,awsuser 将运行以下查询:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    要查看直接授予 newtestuser 的权限,awsuser 将运行以下查询:

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    输出显示,awsusernewtestuser 授予了对 awsusernewtestschema 中创建的所有新表的 SELECT 权限。

    schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
    newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE

相关信息

PG_DEFAULT_ACL

AWS 官方已更新 1 年前