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

上次更新日期:2022 年 10 月 13 日

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

简短描述

要使用户访问架构中新创建的对象,必须由超级用户向这些对象授予权限。

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

ERROR: permission denied for relation “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 pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

如果拥有访问权限,则您将会在列 default_privileges 下看到用户的条目。

现在,当超级用户在架构下创建新对象时,用户将拥有对表的 SELECT 访问权限。

示例

以下示例以此配置开头:

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

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

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

先前的命令奖授予 newtestusernewtestschema 当前存在的表的 SELECT 访问权限。目前,newtestschema 下只存在 newtesttable1 表。newtesttable1 表可供 newtestuser 访问。

接着,awsuser 将会在 newtestschema 下创建另一个名为 newtesttable2 的表。如果 newtestuser 在表 newtestschema.newtesttable2 上运行 SELECT 查询,则它们会看到以下错误:

ERROR: permission denied for relation newtesttable2.

为了解决错误,awsuser 执行以下操作:

1.    通过运行以下示例命令授予表 newtesttable2 的访问权限:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    通过运行以下示例命令向 newtestuser 授予 awsusernewtestschema 下创建的任何后续表访问权限。

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

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

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

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

前面查询的输出与以下类似:

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?