Redshift外部Schema撤销权限不生效问题求助
解决Redshift外部Schema撤销权限后未生效的问题
我之前在处理Redshift外部Schema权限的时候也碰到过类似的情况,明明执行revoke ALL on schema mixpanel_db from group read_group;提示成功,但客户端(包括TablePlus)里权限看起来没变化。给你梳理几个实用的排查和解决步骤:
1. 先确认数据库层面的权限是否真的未变更
TablePlus这类客户端经常会缓存权限信息,别被UI展示误导了。直接用Redshift的系统视图来验证真实权限:
- 查看外部Schema的权限状态:
SELECT * FROM svv_external_schema_privileges WHERE schemaname = 'mixpanel_db' AND grantee = 'read_group'; - 同时检查内部表的权限(如果外部Schema关联了内部对象):
SELECT * FROM information_schema.table_privileges WHERE table_schema = 'mixpanel_db' AND grantee = 'read_group';
如果查询结果里已经没有read_group的权限记录,那问题大概率出在TablePlus的缓存上。
2. 清除TablePlus的缓存并重新连接
如果数据库层面权限已经变更,试试这些操作刷新客户端:
- 断开当前Redshift连接,然后重新建立连接
- 在TablePlus的左侧导航栏,右键点击
mixpanel_dbSchema,选择「刷新」(Refresh) - 重启TablePlus客户端,彻底清除本地缓存
3. 针对外部Schema的特殊性调整撤销命令
Redshift里外部Schema的ALL权限覆盖范围和内部Schema略有不同,有时候单独撤销核心权限会更可靠:
- 单独撤销USAGE权限(这是外部Schema最常用的权限):
REVOKE USAGE ON SCHEMA mixpanel_db FROM GROUP read_group; - 如果该组还有创建对象的权限,也单独撤销:
REVOKE CREATE ON SCHEMA mixpanel_db FROM GROUP read_group;
4. 排查权限继承问题
有可能read_group继承了其他角色的权限,导致撤销后依然有访问权限:
- 查看
read_group包含的用户:SELECT unnest(grolist)::regrole::text AS group_members FROM pg_group WHERE groname = 'read_group'; - 检查这些用户是否拥有
mixpanel_db的单独权限:SELECT * FROM svv_external_schema_privileges WHERE schemaname = 'mixpanel_db' AND grantee IN ( SELECT unnest(grolist)::regrole::text FROM pg_group WHERE groname = 'read_group' ); - 同时确认
read_group是否继承了其他角色的权限:SELECT * FROM pg_user u JOIN pg_auth_members am ON u.usesysid = am.member JOIN pg_roles r ON am.roleid = r.oid WHERE u.usename IN ( SELECT unnest(grolist)::regrole::text FROM pg_group WHERE groname = 'read_group' );
如果发现有继承的权限,需要同步撤销对应的角色权限。
5. 确认执行撤销操作的用户权限
虽然命令提示成功,但有时候Redshift的反馈不够精准,要确保你拥有足够的权限来修改该外部Schema的权限:
SELECT * FROM svv_external_schema_privileges WHERE schemaname = 'mixpanel_db' AND grantee = current_user;
查询结果里需要包含ALTER或GRANT OPTION相关权限,否则你的撤销操作可能实际上没有生效。
内容的提问来源于stack exchange,提问作者Manu Bhogal
相关产品推荐
相关产品推荐

