如何查询可作为SQL作业所有者的登录名列表?
解决SQL Server 2008R2中筛选可作为作业所有者的登录名问题
我完全懂你的困扰——用SELECT * FROM sys.syslogins WHERE hasaccess=1查出来的结果里混了一堆系统内部专用的登录名,这些既没法在SSMS的对象浏览器里找到,也不能真正设置成作业所有者。针对SQL Server 2008R2(及更早的2005版本),你可以用下面这个更精准的查询来过滤掉这些无效选项:
SELECT sp.name AS LoginName, sp.type_desc AS LoginType FROM sys.server_principals sp WHERE -- 只保留可手动选择的登录类型:SQL登录、Windows用户、Windows组 sp.type IN ('S', 'U', 'G') -- 排除已禁用的登录 AND sp.is_disabled = 0 -- 过滤掉系统内置的特殊账户(以##开头结尾) AND sp.name NOT LIKE '##%##' -- 确保登录拥有服务器访问权限(对应你原查询的hasaccess=1) AND EXISTS ( SELECT 1 FROM sys.syslogins sl WHERE sl.name = sp.name AND sl.hasaccess = 1 ) ORDER BY sp.name;
为什么这个查询能解决问题?
咱们拆解下每个条件的作用:
sp.type IN ('S', 'U', 'G'):SQL Server的服务器主体类型里,S是SQL登录、U是Windows域/本地用户、G是Windows组——这些是SSMS作业所有者下拉菜单里会显示的合法类型。像C(证书)、K(非对称密钥)这类系统内部用于签名、代理的主体,直接排除。sp.is_disabled = 0:禁用的登录无法被选为作业所有者,自然要过滤掉。sp.name NOT LIKE '##%##':所有系统内置的特殊登录名都遵循##xxx##的命名规则,比如##MS_AgentSigningCertificate##,这些账户是SQL Server内部使用的,不允许用户手动指定为作业所有者。- 关联
sys.syslogins的hasaccess=1:确保登录拥有服务器的访问权限,和你最初的需求对齐。
补充说明关于BUILTIN\Administrators
你提到的BUILTIN\Administrators其实是合法的作业所有者选项,在SSMS的作业所有者下拉里应该能找到它。如果你确实不想包含Windows组,只需要把G从type的筛选条件里去掉,只保留S和U即可。
另外,sys.syslogins是为了兼容旧版本保留的视图,它会返回所有服务器主体(包括系统内部的),而sys.server_principals是SQL Server 2005及以后引入的更清晰的目录视图,能帮你更精准地筛选出用户可操作的登录账户。
内容的提问来源于stack exchange,提问作者pdube
相关产品推荐
相关产品推荐

