如何在 Amazon Redshift 中为新创建的对象授予权限?
我的用户收到了有关新创建对象的权限遭拒的错误。如何授予用户访问架构中新创建的对象所需的权限?
简短描述
要使用户访问架构中新创建的对象,必须由超级用户向这些对象授予权限。
当用户无法访问架构中新创建的对象时,他们可能会收到以下错误:
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;
先前的命令奖授予 newtestuser 对 newtestschema 当前存在的表的 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 授予 awsuser 在 newtestschema 下创建的任何后续表访问权限。
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
现在,当 awsuser 在 newtestschema 下创建另一个名为 newtesttable3 的新表时,newtestuser 将拥有对 newtesttable3 的 SELECT 访问权限。
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
输出显示 awsuser 向 newtestuser 授予 awsuser 在 newtestschema 中创建的所有新表 SELECT 权限。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前