SQL 2000中的ODBC问题 - > 2005升级

Jay*_*den 18 sql-server ms-access odbc connection-string dbcc

这个wiki帖子概述了问题和解决方案.我想发布这个可能有类似问题的其他人,因为我找不到任何具体的解决方案来解决其他问题.

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

无DSN连接字符串的示例如下所示:

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

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

ODBC - 与"SQL Server"的连接失败

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

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

我们使用Profiler在服务器上运行了一个跟踪,这显示MS Access试图在存储的proc执行之前执行以下命令:

DBCC TRACEON(208)
Run Code Online (Sandbox Code Playgroud)

在存储过程执行之前,它似乎在此命令失败.对Web的研究表明,DBCC TRACEON(208)相当于使用'SET QUOTED IDENTIFIERS ON'命令,并且在SQL 2005中,运行此DBCC命令的priveledges已被撤销.

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

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

经过进一步测试,我们将问题跟踪到APP组件中包含的"版权"符号:

APP=Microsoft® Access (Pass Through Query)
Run Code Online (Sandbox Code Playgroud)

通过删除版权符号,一切都很好的连接和应用程序工作,就像以前在SQL 2000上所做的那样.

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

Joe*_*ine 1

这不是注册商标符号吗?

我相信您已经发现了 sql server 2005 针对基于 odbc 的攻击的防御措施之一。由于互联网上没有任何相关信息,因此这很可能是微软内部处理的事情。