繁体   English   中英

无法从 Redshift 中删除用户

[英]Can't drop user from Redshift

我正在尝试删除用户表单 Redshift 但它总是失败并显示相同的消息

无法删除用户“XXX”,因为该用户对某些 object 具有特权;

在对其进行谷歌搜索后,我发现我需要撤销用户的权限,所以我运行了几个撤销查询,但我仍然失败并显示相同的消息:

我运行的查询:

revoke all on schema YYY from XXX;
revoke usage on schema ZZZ from XXX;
revoke all on database LLL from XXX;

知道为什么我仍然收到此失败消息吗?

从 github "v_get_obj_priv_by_user"部署此视图

完成后,请按照以下步骤操作

  1. 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;

  2. 撤消 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;

  3. 撤销所有 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;

  4. 删除用户用户名;

如果一个集群中有两个数据库,请对两个数据库都执行此操作。

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;

我终于能够找到所有的赠款并生成撤销声明。

在尝试了无数帖子和线程的建议后,awslabs 的aws- redshift -utilsadmin.v_find_dropuser_objs视图的形式提供了缓解。 它立即确定了剩余的依赖项,从而可以删除有问题的用户。

已经在 DBA Stack Exchange 上回复了这里

在删除用户之前,您必须撤销该用户拥有的任何权限,然后转移该用户拥有的任何数据库对象的所有权。

  1. 从 AWS Labs GitHub 存储库下载并安装v_generate_user_grant_revoke_ddl.sql脚本。 此脚本在 Amazon Redshift 中创建一个对接下来的两个步骤有用的视图。

  2. 查找授予该用户的所有权限,然后以超级用户或其他用户的身份再次将这些权限授予该用户,如下例所示。

    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;

  3. 查找授予用户的所有权限,然后撤消这些权限,如以下示例所示。

    SELECT ddl FROM admin.v_generate_user_grant_revoke_ddl WHERE ddltype='revoke' and (grantee='' OR grantor='') order by objseq, grantseq desc;

  4. 从 AWS Labs GitHub 存储库下载并安装v_find_dropuser_objs.sql脚本。 此脚本在 Amazon Redshift 中创建一个对下一步有用的视图。

  5. 查找用户拥有的所有对象,然后将所有权转让给其他用户。 在下面的例子中, 是当前所有者并且是新主人。

  6. 在集群上的每个数据库中重复步骤 2-5。

  7. 删除用户。

    删除用户

来源: https : //aws.amazon.com/premiumsupport/knowledge-center/redshift-user-cannot-be-dropped/

其他人的答案对于理清 redshift 选择使用的许可系统的混乱局面非常有用。 但是,如果像我一样,您是超级用户,并且在尝试更改 redshift 中的默认权限时遇到权限被拒绝的错误,这会阻止您删除用户,请务必使用以下顺序遵循@Vince Hill 的评论:

  1. GRANT ALL ON SCHEMA some_schema TO foobar;
  2. ALTER DEFAULT PRIVILEGES FOR USER foobar IN SCHEMA some_schema REVOKE ALL ON Tables FROM foobar;
  3. REVOKE ALL ON SCHEMA foobar FROM foobar;
  4. DROP USER foobar;

我无法理解为什么我,作为一个可以删除整个集群的超级用户,在没有先执行步骤 1 的情况下尝试步骤 2 时会收到权限被拒绝的错误。绝对令人抓狂,但谢天谢地解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM