默认情况下,登录失败的错误消息意味着客户端用户由于登录凭据不匹配而被服务器拒绝连接。您可能要检查的第一个任务是查看该用户是否在该SQL Server实例和相关数据库上具有相关特权,这很好。显然,如果没有设置必要的特权,则需要授予该用户登录相关特权以解决该问题。
尽管如果该用户对数据库和服务器具有相关授权,但如果服务器遇到该登录的凭据问题,则会阻止向SQL Server授予身份验证,客户端将收到以下错误消息:
Msg 18456, Level 14, State 1, Server <ServerName>, Line 1
Login failed for user '<Name>'
现在怎么办?通过查看错误信息,您可能觉得这个错误描述难以理解级别和状态。默认情况下,操作系统错误将显示“状态”为1,无论验证登录中存在的问题的性质如何。因此,为了进一步调查,您需要查看相关的SQL Server实例错误日志,以获取有关此错误严重性和状态的更多信息。您可以查看日志中相应的条目:
2007-05-17 00:12:00.34 Logon Error: 18456, Severity: 14, State: 8.
or
2007-05-17 00:12:00.34 Logon Login failed for user '<user name>'.
如上所述,错误的严重性和状态列对于查找问题源头的准确反映至关重要。在上述错误编号8中,状态为authentication failure due to password mismatch 表示密码不匹配导致身份验证失败。文档中提到:默认情况下,严重性低于19的用户定义消息在发生时不会发送到 Microsoft Windows 应用程序日志中。因此,严重性低于19的用户定义消息不会触发 SQL Server Agent 警报。
SQL Server协议(开发团队)的程序经理Sung Lee详细阐述了错误状态描述的更多信息:常见的错误状态及其说明如下表所示:
ERROR STATE ERROR DESCRIPTION
2 and 5 Invalid userid
6 Attempt to use a Windows login name with SQL Authentication
7 Login disabled and password mismatch
8 Password mismatch
9 Invalid password
11 and 12 Valid login but server access failure
13 SQL Server service paused
18 Change password required
Well I'm not finished yet, what would you do in case of error:
2007-05-17 00:12:00.34 Logon Login failed for user '<user name>'.
从该 SQL Server 实例的错误日志中可以看到没有定义严重性或状态级别。因此,下一个故障排除选项是查看事件查看器的安全日志[编辑因为缺少屏幕截图,但你可以想象一下,在事件日志中查找有趣的事件]。