SQL Server 2016中sys.sysusers查询结果不一致问题求助
为什么sa和域用户查询sys.sysusers结果差异大?权限调整方案
这事儿我在日常运维里碰到好多次了,核心原因就是权限等级差异——sa是SQL Server的超级管理员(属于sysadmin固定服务器角色),而你的域用户权限不足,导致SQL Server自动过滤了它没权限查看的记录。
差异根源拆解
sys.sysusers是SQL Server的兼容系统视图,它返回的内容不是固定的,会根据当前登录用户的权限动态过滤。- sa作为
sysadmin成员,拥有对所有系统元数据的完全访问权,所以能看到全部42条记录,包括各类数据库角色、内置用户、自定义用户甚至系统隐藏的安全主体。 - 你的域用户大概率只有
public角色的默认权限,或者仅被授予了有限的业务操作权限,SQL Server会只返回该用户有权限查看的对象,所以那些数据库角色相关的记录就被“藏”起来了,只剩22条。
是否需要调整权限?当然需要
如果你希望域用户能看到完整的数据库用户/角色元数据(比如做运维、安全审计),就得针对性调整权限。
权限调整的具体方法
1. 授予数据库级VIEW DEFINITION权限(推荐最小权限原则)
这个权限仅允许用户查看数据库内所有对象的元数据,不会赋予修改权限,非常安全:
USE [你的目标数据库名]; GRANT VIEW DEFINITION TO [你的域用户账号]; -- 格式比如:CORP\JohnDoe
2. 授予服务器级VIEW ANY DEFINITION权限(跨所有数据库)
如果需要让域用户能查看SQL Server实例下所有数据库的元数据,就用这个服务器级权限:
GRANT VIEW ANY DEFINITION TO [你的域用户账号];
3. 添加到db_securityadmin数据库角色(权限更大)
这个角色的成员不仅能查看安全元数据,还能管理数据库用户、角色等安全对象,适合需要做数据库安全管理的用户:
USE [你的目标数据库名]; EXEC sp_addrolemember 'db_securityadmin', [你的域用户账号];
注意:这个权限比单纯的
VIEW DEFINITION要大,只给需要的用户,遵循最小权限原则。
额外建议
sys.sysusers是旧版兼容视图,微软推荐使用新的sys.database_principals系统视图,它的结构更清晰,包含的信息更全面,权限控制逻辑和sys.sysusers一致,调整权限后同样能看到完整内容。
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

