更改 Redshift 表的所有权会引发“必须是超级用户才能更改所有者”

Posted

技术标签:

【中文标题】更改 Redshift 表的所有权会引发“必须是超级用户才能更改所有者”【英文标题】:Altering ownership on Redshift table throws "must be superuser to change owner" 【发布时间】:2020-10-29 10:40:34 【问题描述】:

我遇到了一些简单的 Redshift 命令的问题。

我面临的问题是更改表的所有权,这里有更多详细信息。

在我们的 Redshift 集群中,在我们拥有的一个数据库中,作为管理员用户,我创建了一个架构和组,向其中添加了 2 个用户:

create schema materialized_views_staging;
create group mv_owners with user paul, ana;

paulana 是我们的数据分析师用来访问 Redshift 集群的 2 个用户。

然后我将架构的权限更新为:

grant usage on schema materialized_views_staging TO etl;
grant all on schema materialized_views_staging to group mv_owners;
grant usage on schema materialized_views_staging to group mv_owners;
alter default privileges in schema materialized_views_staging grant all on tables to group mv_owners;

etl 是我们用来运行日常 ETL 作业的用户。

运行以上所有paul后创建了一个表:

create table materialized_views_staging.hj_insights (idd varchar, amount int);

现在,我们需要更改表的所有权,以便每日 ETL 可以在表运行时将数据插入到表中。

此时paulhj_insights 表的所有者。根据AWS documentation,对象的所有者(或超级用户)可以查询、修改或授予对象权限。但是,当paul 运行以下内容时:

ALTER TABLE materialized_views_staging.hj_insights OWNER TO etl;

他得到了错误:

[2020-10-29 10:19:57] [42501][500310] [Amazon](500310) Invalid operation: must be superuser to change owner;

这与文档中的说明相反。

您能在我的流程中发现任何不正确的地方吗?我很确定我已经设置了所有必要的权限。

谢谢!

【问题讨论】:

【参考方案1】:

此答案适用于 PostgreSQL。据 cmets 称,Amazon Redshift 已被修改,因此这是不可能的。

更改所有权与授予特权不同,因此您引用的文档并未涵盖这一点。

The PostgreSQL documentation 状态:

您必须拥有该表才能使用ALTER TABLE。 [...] 要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对表的架构具有 CREATE 权限。

所以你必须同时是paul(或paul的成员)etl(或etl的成员)才能执行命令。超级用户当然可以随时更改所有权。

最后一句话一定有点混乱,所以让我解释一下。在 PostgreSQL 中,用户和组之间没有区别,两者都是“角色”。因此,就像您可以成为组的成员一样,您也可以成为用户的成员。

因此,使所有权更改生效的一种方法是(暂时)使一个用户成为另一个用户的成员:

GRANT etl TO paul;

现在如果你是paul,你同时是etl的成员,你将被允许运行语句。

【讨论】:

嘿,谢谢。所以,etl 实际上是mv_owners 组的一部分,我很遗憾没有在上面说明。我只是快速检查以确认这一点,但我仍然收到同样的错误。 你一定误解了我的意思:你必须同时是etlpaul(或其中的成员)才能更改所有权。 etlpaul 属于哪个组无关紧要。 对不起,我没有关注。如果 etlpaul 是 2 个具有用于连接到集群的密码的用户,我怎么可能同时是 etlpaul 我知道这令人困惑。我已经扩展了答案,希望能让事情变得清晰。 感谢 Laurenz,现在它更清楚了,我可以按照您的要求进行操作。不幸的是,您提供的命令不适用于 Redshift [42601][500310] [Amazon](500310) Invalid operation: syntax error at or near "etl"

以上是关于更改 Redshift 表的所有权会引发“必须是超级用户才能更改所有者”的主要内容,如果未能解决你的问题,请参考以下文章

如果 S3 前缀不存在,Redshift COPY 命令会引发错误

从 redshift 中删除外部表的所有分区

redshift 更改 udf 更改所有者

Redshift Python UDF 自行运行,但在部分使用 count 或作为另一个查询的一部分时会引发错误

如果主键更改,SQL 更新触发器会引发错误

Redshift 表所有权和删除查询