You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询可作为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:47:37