如何查询SQL Server数据库中当前用户的权限?
嘿,刚好我经常帮人处理这类权限查询的需求,给你几个实用的SQL语句,帮你快速摸清自己在当前SQL Server数据库里的权限:
查询自身数据库权限的常用SQL语句
1. 查看当前数据库的直接权限
这个语句会列出你被直接赋予的、针对数据库对象(表、视图、存储过程等)的权限,清晰展示权限类型和状态:
USE YourDatabaseName; -- 替换成目标数据库名,也可以用CURRENT_DATABASE()自动获取当前库 SELECT dp.permission_name, dp.state_desc, o.name AS object_name, o.type_desc AS object_type FROM sys.database_permissions dp JOIN sys.database_principals dpri ON dp.grantee_principal_id = dpri.principal_id JOIN sys.objects o ON dp.major_id = o.object_id WHERE dpri.name = USER_NAME();
小贴士:USER_NAME()会自动获取当前登录的用户名,不用手动输入;state_desc会显示权限是授予(GRANT)、拒绝(DENY)还是允许授予(GRANT_WITH_GRANT_OPTION)。
2. 查看通过数据库角色继承的权限
很多时候你的权限是通过加入某个数据库角色获得的,这个语句能帮你查到这些继承来的权限:
USE YourDatabaseName; SELECT rp.name AS role_name, dp.permission_name, dp.state_desc, o.name AS object_name, o.type_desc AS object_type FROM sys.database_role_members drm JOIN sys.database_principals rp ON drm.role_principal_id = rp.principal_id JOIN sys.database_permissions dp ON rp.principal_id = dp.grantee_principal_id JOIN sys.objects o ON dp.major_id = o.object_id WHERE drm.member_principal_id = USER_ID();
它会关联你所属的角色,以及角色拥有的所有权限,帮你理清权限来源。
3. 查看服务器级权限(可选)
如果想了解自己在整个SQL Server实例层面的权限(比如创建数据库、登录服务器的权限),可以用这个语句:
SELECT sp.permission_name, sp.state_desc, srv.name AS server_object FROM sys.server_permissions sp JOIN sys.server_principals spri ON sp.grantee_principal_id = spri.principal_id LEFT JOIN sys.servers srv ON sp.major_id = srv.server_id WHERE spri.name = SUSER_SNAME();
SUSER_SNAME()会自动获取当前的登录名,适配服务器级权限查询。
4. 快速检查高权限角色身份
要是你想快速确认自己是不是db_owner、sysadmin这类高权限角色的成员,用这两个简单的语句就够了:
-- 查看数据库级高权限角色 SELECT name AS database_role FROM sys.database_principals WHERE type = 'R' AND IS_ROLEMEMBER(name) = 1; -- 查看服务器级高权限角色 SELECT name AS server_role FROM sys.server_principals WHERE type = 'R' AND IS_SRVROLEMEMBER(name) = 1;
这些语句基本覆盖了大部分常见场景,你可以根据需求选择执行。如果要查询特定对象的权限,还可以在WHERE子句里添加过滤条件哦~
内容的提问来源于stack exchange,提问作者Nbenz




