Redshift中无法删除拥有对象的用户,如何彻底取消其数据库访问权限?
解决Redshift无法删除用户及彻底禁用访问的问题
第一步:立即禁用用户访问(优先满足安全需求)
不用先处理所有权问题,直接执行以下命令让用户彻底无法登录数据库:
ALTER USER person_username NOLOGIN;
执行后,该用户立刻无法通过任何方式访问Redshift,不管他是否拥有对象,先解决核心安全需求。
第二步:转移用户拥有的所有对象所有权
因为直接删除用户时提示“用户拥有对象”,需要把该用户名下所有对象(表、视图、序列等)的所有权转移给其他用户/角色:
- 先查询该用户拥有的所有对象(含所属模式):
SELECT n.nspname AS schema_name, c.relname AS object_name, c.relkind AS object_type FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE c.relowner = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = 'person_username');
- 生成批量转移所有权的SQL语句:
将下面语句中的admin_user替换为你要转移到的目标用户或角色,执行后会生成所有需要执行的ALTER命令:
SELECT 'ALTER ' || CASE c.relkind WHEN 'r' THEN 'TABLE' WHEN 'v' THEN 'VIEW' WHEN 'S' THEN 'SEQUENCE' WHEN 'm' THEN 'MATERIALIZED VIEW' END || ' "' || n.nspname || '"."' || c.relname || '" OWNER TO admin_user;' AS alter_command FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid WHERE c.relowner = (SELECT usesysid FROM pg_catalog.pg_user WHERE usename = 'person_username');
- 执行生成的所有ALTER命令,完成所有权转移。
第三步:删除用户
所有权转移完成后,执行删除命令即可成功删除用户:
DROP USER person_username;
补充说明
- 若不想彻底删除用户,仅需永久禁用访问,只执行第一步的
NOLOGIN命令即可,无需后续操作。 - 上述批量处理方式会自动覆盖该用户所有模式下的对象,无需逐个指定模式处理。
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

