如何在 SQL Server 2005 中创建指向受密码保护的 Access 95 数据库的链接服务器?

如何在 SQL Server 2005 中创建指向受密码保护的 Access 95 数据库的链接服务器?

我需要使用 SQL Server Management Studio 2005 创建链接到 Access 95 数据库的服务器,该数据库恰好在数据库级别受密码保护。用户级安全性尚未实现。

我无法将 Access 数据库转换为较新版本。该数据库正由第三方应用程序使用;因此不允许以任何方式对其进行修改。

我尝试使用 Jet 4.0 OLE DB 提供程序和 ODBC OLE DB 提供程序。第三方应用程序创建了一个系统 DSN(带有正确的数据库密码),但我使用这两种方法都没有成功。

如果我使用标准连接字符串,我认为它看起来会像这样:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Test.mdb';Jet OLEDB:Database Password=####;

我相当确定我需要以某种方式纳入Jet OLEDB:Database Password链接服务器设置,但还没有想出如何做。

我已将我正在使用的脚本以及相关错误消息发布在下面。任何帮助都将不胜感激。如果需要,我会提供更多详细信息,只需询问即可。

谢谢!

方法#1-使用 Jet 4.0 提供程序当我尝试运行这些语句来创建链接服务器时:

sp_dropserver 'Test', 'droplogins';
EXEC sp_addlinkedserver @server = N'Test', @provider = N'Microsoft.Jet.OLEDB.4.0',
    @srvproduct = N'Access DB', @datasrc = N'C:\Test.mdb'
GO

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Test', @useself=N'False',@locallogin=NULL,
    @rmtuser=N'Admin', @rmtpassword='####'
GO

测试连接时出现此错误:

TITLE: Microsoft SQL Server Management Studio
------------------------------

"The test connection to the linked server failed."

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

The OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test" reported an error. Authentication failed.
Cannot initialize the data source object of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test".
OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test" returned message "Cannot start your application. The workgroup information file is missing or opened exclusively by another user.". (Microsoft SQL Server, Error: 7399)

------------------------------

方法 #2 - 使用 ODBC 提供程序...

sp_dropserver 'Test', 'droplogins';
EXEC sp_addlinkedserver @server = N'Test', @provider = N'MSDASQL', 
    @srvproduct = N'ODBC', @datasrc = N'Test:DSN'
GO

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Test', @useself=N'False',@locallogin=NULL,
    @rmtuser=N'Admin', @rmtpassword='####'
GO

我收到此错误:

TITLE: Microsoft SQL Server Management Studio
------------------------------

"The test connection to the linked server failed."

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "Test".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Microsoft Access Driver] Cannot open database '(unknown)'.  It may not be a database that your application recognizes, or the file may be corrupt.". (Microsoft SQL Server, Error: 7303)

答案1

经过几个小时的努力,我终于找到了两个解决方案!我使用的是 SQL Server 2008 和 Access 2000,但我猜解决方案是一样的。

解决方案 1:使用 OPENDATASOURCE

当您不频繁访问链接服务器上的数据时,请使用这种方法:

select * from 
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Data Source=C:\MyAccessDB.mdb;User ID=Admin;Password=;Jet OLEDB:Database Password=MyDBPassword;')...MyTable

为了使其正常工作,您还需要打开以下Ad Hoc Distributed Queries选项:

exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

解决方案 2:使用链接服务器

正如您之前所述,链接服务器似乎无法正常工作。但是,有一个小问题可以让一切顺利进行;您需要在提供程序字符串中指定数据库密码,例如;PWD=password

exec sp_addlinkedserver 
    @server = 'TestLinkServer', 
    @provider = 'Microsoft.Jet.OLEDB.4.0', 
    @srvproduct = 'Access',
    @datasrc = 'C:\MyAccessDB.mdb', 
    @provstr = ';PWD=MyDBPassword'

exec sp_addlinkedsrvlogin 
    @rmtsrvname = 'TestLinkServer',
    @useself = 'FALSE',
    @locallogin = null, 
    @rmtuser = 'Admin', 
    @rmtpassword = null

现在您可以将 Access 数据库作为链接服务器进行查询:

select * from TestLinkServer...MyTable

答案2

您似乎没有区分数据库密码(首次引入于 Jet 3.0,即 A95 中的 Jet 版本)和 Jet 用户级安全用户名/密码。您的示例都是后者,但您在问题中提到了数据库密码。只有 OLEDB 支持该功能(ODBC 不支持),因此您需要检查http://www.connectionstrings.com/access用于带有数据库密码的 OLEDB 连接字符串。

相关内容