无法从 Redshift 中删除用户
Posted
技术标签:
【中文标题】无法从 Redshift 中删除用户【英文标题】:Can't drop user from Redshift 【发布时间】:2016-11-17 08:56:27 【问题描述】:我正在尝试从 Redshift 中删除用户,但它总是失败并显示相同的消息
无法删除用户“XXX”,因为该用户在某些方面拥有特权 对象;
在谷歌搜索之后,我发现我需要撤销用户的权限,所以我运行了几个撤销查询,但仍然失败并显示相同的消息:
我运行的查询:
revoke all on schema YYY from XXX;
revoke usage on schema ZZZ from XXX;
revoke all on database LLL from XXX;
知道为什么我仍然收到此失败消息吗?
【问题讨论】:
尝试级联选项以查看撤销被传播 @kadalamittai - 谢谢,但没有帮助。我仍然收到相同的消息 已回复dba.stackexchange.com/questions/143938/… 【参考方案1】:请部署this view from github "v_get_obj_priv_by_user"
完成后,请按照以下步骤操作
A_user ---必须删除的用户
B_user ---旧表的表所有权需要映射到这个用户。
如果你想改变所有属于A_user的表的所有者,那么
select schemaname,tablename from pg_tables where tableowner like 'A_user';
对于检索到的上述表格运行
alter table schemaname.tablename owner to B_user;
撤销所有 A_user 具有某些权限的架构
select distinct schemaname from admin.v_get_obj_priv_by_user where usename like 'A_user';
对于检索到的上述表格运行
revoke all on schema XXXX from A_user;
撤销所有 A_user 具有某些权限的表
select distinct tables from admin.v_get_obj_priv_by_user where usename like 'A_user';
对于检索到的上述表格运行
revoke all on all tables in schema XXXX from A_user;
删除用户用户名;
如果一个集群中有两个数据库,请对两个数据库都这样做。
【讨论】:
如果您收到管理员架构不存在的错误,只需在 GitHub proc 和之后的查询中替换“public”而不是“admin”。这是一种享受,谢谢。【参考方案2】:v_generate_user_grant_revoke_ddl 管理视图允许您查看现有授权及其相应的撤销。
有了这个sql:
SELECT
ddl
FROM admin.v_generate_user_grant_revoke_ddl
WHERE ddltype = 'revoke'
AND (grantee = '<USERNAME>' OR grantor = '<USERNAME>')
ORDER BY
objseq,
grantseq desc;
我终于能够找到所有授权并生成撤销声明。
【讨论】:
这对我有用,但只有在我意识到我必须撤销架构的默认权限之前我撤销了架构本身的权限之后。因此,只有当 s105846 对 'sor_ccr' 模式具有特权时,语句ALTER DEFAULT PRIVILEGES for user s105486 in schema sor_ccr revoke ALL on tables FROM group dev_sor_ccr_rw;
才能成功。就我而言,我只是在架构上授予 ALL,然后在默认权限消失后撤销 ALL。直到那时我才终于能够删除我的用户。
效果很好,您可能必须先使用create schema admin;
创建管理架构。【参考方案3】:
在尝试了无数帖子和线程的建议后,awslabs 的 aws-redshift-utils 以admin.v_find_dropuser_objs 视图的形式提供了缓解。它立即识别出剩余的依赖关系,从而可以删除有问题的用户。
【讨论】:
【参考方案4】:已经在 DBA Stack Exchange 上回复了here。
在删除用户之前,您必须撤销该用户拥有的所有权限,然后转移该用户拥有的任何数据库对象的所有权。
从 AWS Labs GitHub 存储库下载并安装 v_generate_user_grant_revoke_ddl.sql 脚本。此脚本在 Amazon Redshift 中创建一个视图,对接下来的两个步骤很有用。
找到授予该用户的所有权限,然后以超级用户或其他用户的身份再次将这些权限授予该用户,如下例所示。
SELECT regexp_replace(ddl,grantor,'') FROM admin.v_generate_user_grant_revoke_ddl WHERE grantor='' and ddltype='grant' AND objtype 'default acl' order by objseq,grantseq;
查找授予用户的所有权限,然后撤销这些权限,如下例所示。
选择 ddl FROM admin.v_generate_user_grant_revoke_ddl WHERE ddltype='revoke' 和 (grantee='' OR grantor='') 按 objseq 排序,grantseq desc;
从 AWS Labs GitHub 存储库下载并安装 v_find_dropuser_objs.sql 脚本。此脚本在 Amazon Redshift 中创建一个对下一步很有用的视图。
查找用户拥有的所有对象,然后将所有权转让给其他用户。在下面的示例中, 是当前所有者, 是新所有者。
在集群上的每个数据库中重复步骤 2-5。
删除用户。
删除用户
来源:https://aws.amazon.com/premiumsupport/knowledge-center/redshift-user-cannot-be-dropped/
编辑:如果上述方法都不起作用,可能是因为 Redshift 端基于角色的访问控制 (RBAC) 系统中的错误。
他们计划应用永久修复,但万一联系 AWS Support,他们将能够应用解决方法(可能需要重新启动集群)。
【讨论】:
以上是关于无法从 Redshift 中删除用户的主要内容,如果未能解决你的问题,请参考以下文章
UNLOAD 命令是不是从 redshift 中删除或删除数据?