2009-09-01 38 views
17

本维基文章概述了问题和解决方案。我想将其发布给可能存在类似问题的其他人,因为我找不到任何专门解决其他问题的任何问题。SQL 2000中的ODBC问题 - > 2005升级

我们最近将SQL Server 2000数据库升级到SQL Server 2005.服务器上的其中一个数据库是MS Access数据库的后端。 MS Access数据库使用传递查询,通过DSN-less ODBC连接到SQL Server。

的DSN-less连接字符串的示例如下:

ODBC; DRIVER=SQL Server;SERVER=servername;APP=Microsoft® Access (Pass Through 
    Query);DATABASE=databasename;Network=DBMSSOCN;ConnectionTimeout=20; 
    Trusted_Connection=Yes 

升级后,我们发现,用户无法运行传递查询,并得到显示以下错误:

ODBC - 连接 '的SQL Server ' 失败

这最初似乎是一个权限问题,因为将SQL服务器登录的权限提升到sysadmin服务器角色缓解了问题(但显然这不是一个好的解决方案)。

将登录从sysadmin角色中取出后,我们发现通过Management Studio连接到SQL Server时,登录可以执行存储过程。在MS Access中,登录不能完全相同。这指向MS Access在尝试执行存储过程时所做的事情 - 而不是权限问题。

我们跑使用探查服务器上的痕迹,这表明了的MS Access试图存储过程执行之前执行以下命令:

DBCC TRACEON(208) 

它出现在该命令失败,存储之前,程序执行。对网络的研究表明,DBCC TRACEON(208)相当于使用'SET引用标识符ON'命令,并且在SQL 2005中,运行此DBCC命令的管理员已被撤销。

经过进一步研究,我们发现MS Query的引用有类似的问题,并且连接字符串的APP组件应该从'MS Query'更改为其他内容。

在预感上,我们更改了ODBC连接字符串的APP组件,并且MS Access不再在存储过程执行之前尝试执行DBCC TRACEON(208)。

进一步的测试后,我们跟踪这个问题到包含在APP组件的“版权”符号:

APP=Microsoft® Access (Pass Through Query) 

删除版权符号,所有连接的一致好评和应用程序的工作,因为它以前在SQL 2000上完成的。

希望这可以帮助其他任何有类似问题的人。

+0

解决这个问题,并花时间发布它的优秀工作。我敢打赌,你的头发比你在第一次出现这种问题时的头发少... – 2009-09-02 02:36:43

+0

感谢你分享这个。你能把它分成问题和答案吗?它将更好地服务于SO设计。 – 2009-09-02 10:39:16

+0

已回答?如果是这样,请将其标记! – djangofan 2009-09-02 15:11:26

回答

1

是不是注册商标符号?

我相信你击中了SQL Server 2005的防御基于odbc的攻击的防御之一。由于互联网上没有任何关于它的内容,它可能是MS在内部处理的东西。

+0

是的,你可能是正确的注册商标,而不是版权符号。它是一个或另一个,但注册商标更合适,我现在已将它从连接中移除,因此无法返回并检查。干杯 – Jayden 2009-09-03 09:41:26