如何解决 SQL Server 中的登录失败错误?

Mik*_*lsh 6 sql-server

对 SQL Server 登录错误进行故障排除的一些技巧是什么?像这样的问题:

  1. 如何查看完整的错误消息?我的客户只有一条通用错误消息,指出登录失败,没有真实信息/状态信息。
  2. 如果错误日志中没有错误,但我仍然无法连接怎么办?
  3. 如何阅读登录失败(错误 18456)错误消息?
  4. 如何对错误消息中发现的各种情况进行故障排除?
  5. 什么是 Kerberos,我为什么关心以及如何修复与之相关的错误?

Mik*_*lsh 8

如何查看完整的错误消息?

您尝试连接的实例上的 SQL Server 错误日志将包含 SQL Server 生成的有关登录失败的任何错误。如果 SQL 由于某种原因拒绝连接/登录失败,通常会生成 18456 错误。在 SQL 端,此错误将具有错误状态,可提供错误原因的线索。但是,在客户端,您可能会也可能不会看到有用的详细信息 - 您可能只会看到错误状态 1。

要查看完整的错误消息,最好查看您尝试连接的 SQL Server 并查看 SQL Server 错误日志。如果连接正在与 SQL Server 建立连接,您应该会看到连接尝试的错误。如果您知道在哪里查看,那么这些信息比其他一些错误消息更有用。

如果 SQL Server 错误日志中没有错误怎么办?

这可能是由多种因素引起的,但很可能您没有处理登录失败。登录失败在错误日志中表现得很好。在这种情况下,您很可能会遇到无法连接到 SQL Server 的情况。您可以先解决这个问题,至少首先验证您连接到 SQL Server 并且这里没有问题。这篇 Technet Twiki 文章不是在此答案中介绍所有可能的故障排除步骤,而是一个极好的资源,至少可以帮助您入门。

如何读取日志中的错误信息?

有多种资源可以了解各种错误状态和错误消息的含义。以下内容是从此msdn 链接粘贴的,以帮助您了解 18456 错误的一些更常见状态。这些状态可能会在未来版本或您所在的版本中发生变化,因此最好同时关注消息和状态并深入了解问题。

状态 ---- 含义

2  ---- User ID is not valid.
5  ---- User ID is not valid.
6  ---- An attempt was made to use a Windows login name with SQL Server Authentication.
7  ---- Login is disabled, and the password is incorrect.
8  ---- The password is incorrect.
9  ---- Password is not valid.
11 ---- Login is valid, but server access failed.
12 ---- Login is valid login, but server access failed.
18 ---- Password must be changed.
Run Code Online (Sandbox Code Playgroud)

还有许多其他状态,在编辑中我会添加更多或在其他答案中你会看到更多。此链接还有许多其他状态,其中大部分对 2000 年以上 SQL Server 的大多数版本都有效。这里重要的一点是查看服务器端的错误日志并阅读消息 - 登录失败时,消息往往经常有用。

同样,状态 1 是客户端上的通用消息。

其他错误 SQL Server 登录或连接失败还有其他错误。在将来的编辑或其他人的回答中,也可以添加更多信息。

我如何处理这些数据?

这取决于..

明显的状态

状态 2 和 5 表示无效的用户 ID。检查您正在使用的用户。您的登录名是否存在?您是否指定了数据库以及登录是否以用户身份存在 - 是否已在该数据库中映射为用户。

状态 6 - 糟糕!您正在尝试以使用 SQL 身份验证的方式传递 Active Directory 登录名。基本上是尝试传递“FunDomain\Mwalsh”的登录名,但您正在使用 SQL 身份验证进行连接,不受信任。这有点像 2 或 5,只是更具描述性。

状态 7 - 登录被禁用.. 查看它被禁用的位置,为什么它被禁用并纠正这种情况。

状态 8 和 9 - 密码错误。是不是打错字了?密码改了吗?

状态 18 - 我从未在野外遇到过这种情况。但它告诉我们我们的密码已设置为更改。我想如果您从使用 SQL 身份验证的应用程序(如 Great Plains ...)进行连接并设置了一个新帐户,该帐户的密码在首次使用时需要更改,但您的应用程序不理解或具有更改密码的功能。如果您只使用 SSMS,您只会得到一个更改密码的对话框,一切都很好。

不太明显的状态

11 和 12 的意思是一样的——这些是你必须密切关注的消息。

错误消息中是否有“令牌”一词?就像“用户‘myDomain\UserName’登录失败。原因:基于令牌的服务器访问验证失败,出现基础结构错误。检查以前的错误。”

这可能是您的 SQL Server 服务作为本地系统运行的情况,而不是可能访问域信息的域帐户。

也可能是需要通过 kerberos 委派权限的情况——例如,当通过 Windows 身份验证访问链接服务器并传递凭据时——双跳需要 Kerberos,而不是 NTLM。因此,您需要使用 Kerberos。

即使这条消息也可能意味着其他事情 - 我最近在迁移到具有现有登录的服务器后看到了这一点 - 在我的客户端环境中这是一个非常古老的登录。删除并重新创建登录解决了该问题。为什么?这可能是一些事情,但几年前来自 Simon Sabin的这篇文章在这里是一个很好的资源。

更新在回答这个问题后,我想查看关于默认数据库的错误代码,我找到了Aaron Bertrand 的一篇很棒的博客文章,他在这里回答了很多问题:-) 去查看他的资源以获取更多错误消息,包括许多不在SQL Server 2012 或 2008 但仍在使用的版本中。那里有很棒的东西:-)