SQL Server中查用户角色应查询sys.database_role_members视图,它记录数据库内用户与角色的隶属关系,需连接目标数据库并联查sys.database_principals获取用户名和角色名,且仅反映数据库级角色。

SQL Server 中查用户角色:用系统视图 sys.database_role_members
在 SQL Server 里,DBeaver 本身不提供“点一点就出角色归属”的图形化按钮,得靠查询系统视图。最直接的方式是查 sys.database_role_members,它记录了谁属于哪个数据库角色。
执行前先确认当前连接的数据库是目标库(比如 mydb),然后运行:
SELECT
dp1.name AS user_name,
dp2.name AS role_name
FROM sys.database_role_members drm
JOIN sys.database_principals dp1 ON drm.member_principal_id = dp1.principal_id
JOIN sys.database_principals dp2 ON drm.role_principal_id = dp2.principal_id
WHERE dp1.type IN ('S', 'U', 'G') -- 排除系统内置主体
ORDER BY dp1.name;
- 如果只关心某个用户(如
app_user),加AND dp1.name = 'app_user' -
dp1.type = 'S'表示 SQL 登录用户,'U'是 Windows 用户,'G'是 Windows 组 - 注意:这个视图只反映当前数据库内的角色成员关系,不包含服务器级角色(如
sysadmin)
Oracle 中查用户角色:查 dba_role_privs 或 user_role_privs
Oracle 的角色归属分两级:当前用户能看到自己的角色(用 user_role_privs),DBA 才能看全库(用 dba_role_privs)。DBeaver 连接后,直接执行对应查询即可。
普通用户查自己:
SELECT granted_role, admin_option, default_role FROM user_role_privs;
DBA 查指定用户(如 HR):
SELECT grantee, granted_role, admin_option FROM dba_role_privs WHERE grantee = 'HR';
-
admin_option = 'YES'表示该用户可把此角色再授给他人 -
default_role = 'YES'表示登录时自动激活该角色(影响权限生效) - 大小写敏感:Oracle 默认用户名/角色名大写,
WHERE grantee = 'hr'查不到结果
MySQL / PostgreSQL 用户角色模型不同,别套用 SQL Server 写法
MySQL 8.0+ 虽引入了角色(CREATE ROLE),但角色归属信息不在单一视图里,要联合查 mysql.role_edges 和 mysql.users;PostgreSQL 更是把“角色”和“用户”统一为 pg_roles,成员关系存在 pg_auth_members 中——这两者都不能直接复用 SQL Server 的 sys.database_role_members 查询逻辑。
- MySQL 查某用户被授予的角色:
SELECT * FROM mysql.role_edges WHERE TO_HOST = '' AND TO_USER = 'myuser'; - PostgreSQL 查角色成员:
SELECT rolname FROM pg_roles JOIN pg_auth_members ON pg_roles.oid = pg_auth_members.member WHERE pg_roles.rolname = 'myuser'; - DBeaver 对 MySQL/PG 的元数据解析较完整,右键用户 → “编辑” → “角色”标签页也能看到分配情况,但底层仍是走这些系统表
权限没生效?重点检查 default_role 和当前 session
查到用户确实被赋予了角色,但 SELECT 还报错,大概率是角色没默认激活,或当前会话没刷新。
- Oracle 中:即使有角色,若
default_role = 'NO',必须手动SET ROLE role_name;才生效 - SQL Server 中:角色变更后,已有连接不会自动更新权限,需断开重连或执行
EXEC sp_refresh_session_permissions;(2016+ 版本) - DBeaver 的“刷新”按钮(F5)只刷新对象树,不重载权限上下文——这点容易忽略











