SQL Server 2008服务器端“无效的用户ID”(错误18456,严重性:14,状态:5)

时间:2010-12-04 01:04:01

标签: sql-server-2008 odbc ms-access-2003

错误

数据库管理员报告Microsoft SQL Server 2008服务器端错误“无效登录”(错误18456,严重性:14,状态:5)。

服务器日志中的错误示例:

Dec 1 2010 10:12AM - Login failed for user '{Active Directory Name #1}'. Reason: Could not find a login matching the name provided. [CLIENT: {IP Address #1}]
Dec 1 2010 10:44AM - Login failed for user '{Active Directory Name #2}'. Reason: Could not find a login matching the name provided. [CLIENT: {IP Address #2}]
Dec 1 2010 2:03PM - Login failed for user '{Active Directory Name #3}'. Reason: Could not find a login matching the name provided. [CLIENT: {IP Address #3}]
Dec 1 2010 4:18PM - Login failed for user 'Admin'. Reason: Could not find a login matching the name provided. [CLIENT: {IP Address #1}]

{Active Directory Name}与其登录名相同,没有域。例如,全名为{domain} \ {Active Directory Name}。

用户“Admin”的错误来自与{Active Directory Name#1}相同的IP地址,这是一个开发Microsoft Access Visual Basic for Applications(VBA)代码的用户;我怀疑这是因为需要使用正确的Windows身份验证连接字符串来配置他对VBA的最小使用,即使他只是通过ODBC DSN链接访问数据。

环境

Microsoft Access 2003(前端)数据库,包含ODBC文件DSN链接到只读Microsoft SQL Server 2008(后端)数据库中的表。

我拥有前端数据库的管理员权限。我对后端数据库具有只读安全权限,后端数据库驻留在外部数据中心的托管服务器上。 DBA已为Windows身份验证配置了后端数据库。

最终用户使用Active Directory帐户登录其PC,打开前端数据库,然后使用Microsoft Access查询设计器使用指向后端数据库的表链接生成报告。前端数据库不使用Microsoft Access Jet Security(据我所知 - 没有登录提示)。

前端数据库报告没有(可见)错误并产生预期结果。

ODBC文件DSN内容

[ODBC]
DRIVER=SQL Server
Trusted_Connection=Yes
StatsLogFile={path}
StatsLog_On=Yes
DATABASE={dbname}
APP=Microsoft Data Access Components
Description={general description}
SERVER={server name}

为什么文件DSN链接可以正常工作,而不会出现错误,但会生成服务器端无效登录错误?谢谢。

2 个答案:

答案 0 :(得分:1)

最终用户是否有机会看到缓存数据? SQL Server是否设置为允许远程连接? AD帐户是否设置为登录以及相应数据库上的授权用户?通过ODBC管理器测试ODBC连接时,您是否获得了成功的连接?成功的连接测试是否会生成错误?后端数据库和前端应用程序是否位于同一个域中?如果没有,是否有域信任设置? (如果不是,您可能需要使用SQL登录而不是AD)

这些是我通常会尝试解决此类问题的所有类型的事情。

答案 1 :(得分:0)

问题的来源似乎是ODBC连接字符串上的未记录的(?),Microsoft Access 255字符限制。

每个Microsoft Access ODBC链接表都是使用包含“Trusted_Connection = Yes”行的DSN文件创建的。

据推测,这告诉Microsoft Access使用Windows身份验证。

但是,在仔细检查其中一个ODBC链接表时,我注意到文本“Trusted_Connection = Yes”超出了文本的前255个字符。通过使用VBA立即窗口和运行命令

,我可以看到它在那里

print CurrentDb.TableDefs(“{table}”)。Connect

但这只打印271个字符,而不是完整的字符串。但是,最后10个字符是:

Trusted_Co

将表重新链接到前255个字符中包含Trusted_Connection = Yes行的DSN文件解决了问题。

谢谢。