You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何查询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_ownersysadmin这类高权限角色的成员,用这两个简单的语句就够了:

-- 查看数据库级高权限角色
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

火山引擎 最新活动