如何查询Redshift中表绑定角色、用户所属角色及角色权限?
Redshift Serverless 角色权限查询方案
问题原因
你遇到的报错和空结果问题来自三个原因:
- 你查询的
pg_role是错误的对象名,Redshift中存储角色元数据的系统视图为pg_roles svv_roles、svv_user_grants等svv_*前缀的Redshift专属系统视图,默认仅工作区初始管理员用户有查询权限,普通用户未被授权时直接查询会返回permission denied错误information_schema.role_table_grants是PostgreSQL兼容视图,仅返回当前查询用户被直接授予的权限,不包含角色继承的权限,也不展示其他用户/角色的权限,因此普通用户查询时大概率返回空结果。
前置操作
使用Redshift Serverless工作区创建时指定的初始管理员账号登录,给需要查询权限的业务用户授予系统视图的查询权限:
-- 将下方的<query_username>替换为实际用来执行查询的用户名 GRANT SELECT ON svv_roles TO <query_username>; GRANT SELECT ON svv_user_grants TO <query_username>; GRANT SELECT ON svv_role_grants TO <query_username>; GRANT SELECT ON svv_table_privileges TO <query_username>;
各场景查询SQL
1. 查询用户-角色绑定关系
授权后执行以下SQL,可获取所有用户关联的角色、是否具备角色管理员权限:
SELECT user_name, role_name, admin_option FROM svv_user_grants;
如果存在角色嵌套授权(比如将角色A授予角色B),可通过以下SQL查询角色间的绑定关系:
SELECT role_name AS granted_child_role, grantee_name AS parent_role, admin_option FROM svv_role_grants WHERE grantee_type = 'ROLE';
2. 查询角色-表绑定关系及对应操作权限
通过svv_table_privileges视图可查询所有角色、用户被授予的表级权限,包含SELECT、UPDATE、INSERT、DELETE等所有操作类型:
SELECT grantee_name AS auth_subject, grantee_type, -- 字段值为ROLE/USER,可用来筛选主体类型 table_schema, table_name, privilege_type -- 对应具体权限:SELECT/UPDATE/INSERT/DELETE/REFERENCES/TRUNCATE等 FROM svv_table_privileges -- 仅查询角色的权限就保留下方筛选条件,要查用户权限就将值改为'USER' WHERE grantee_type = 'ROLE';
如果需要查询指定角色的表权限,新增筛选条件即可:
SELECT table_schema, table_name, privilege_type FROM svv_table_privileges WHERE grantee_type = 'ROLE' AND grantee_name = '替换为你要查询的目标角色名';
补充说明:不建议使用
pg_roles做权限盘点,该视图仅展示当前用户可感知的角色元数据,无法返回全量角色权限信息,优先使用svv_*系列视图查询结果更准确。
内容的提问来源于stack exchange,提问作者Oz2000
相关产品推荐
相关产品推荐

