我有以下情况:
- 远程服务器共享文件夹上的 Access 2010 数据库 (.accdb)。
- 可以访问共享文件夹和文件的域帐户。
- SQL Server 2014 x64 在不属于 Access 文件所在域的完全不同网络上的不同服务器上运行。
- 访问 SQL Server 2014 的用户是 SQL Server 用户,而不是 Windows 用户。
- SQL Server 2014 机器可以通过 VPN 连接到共享文件夹的服务器
我想要达到的目标:
- 我想在我的 SQL Server 2014 中添加 Access 2010 数据库作为链接服务器
我已经在 SQL Server 机器上安装了适用于 x64 的 Microsoft.OLEDB.12.0 驱动程序,它们对本地 Access 2010 文件正常工作。
我使用以下命令将 Access 数据库添加为链接服务器:
EXEC master.dbo.sp_addlinkedserver
@server = N'ACCESSDB',
@srvproduct=N'ACCESSDB',
@provider=N'Microsoft.ACE.OLEDB.12.0',
@datasrc=N'\\192.168.100.64\accessdb$\MyAccessDb.accdb',
@provstr=N';PWD=THEPASSWORD;Mode=Read'
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'ACCESSDB',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'theremotedomain\theuser',
@rmtpassword='theuserpassword'
这些命令工作正常,不会返回任何错误。
当我尝试从 SQL Server Management Studio 测试连接时,我收到以下错误:
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.ACE.OLEDB.12.0" for linked server "ACCESSDB" reported an error. Authentication failed.
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "ACCESSDB".
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "ACCESSDB" returned message "Not a valid account name or password.". (Microsoft SQL Server, Error: 7399)
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=10.50.3720&EvtSrc=MSSQLServer&EvtID=7399&LinkId=20476
------------------------------
BUTTONS:
OK
------------------------------
这有什么问题?有什么方法可以调试 SQL Server 和链接服务器之间发生的事情?
更新
如果我将访问密码信息添加到链接服务器登录,如下所示:
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'WINMARK',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'admin',
@rmtpassword='THEPASSWORD'
先前的错误消失了,并弹出了一个新错误:
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.ACE.OLEDB.12.0" for linked server "WINMARK" reported an error. Authentication failed.
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "WINMARK".
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "WINMARK" returned message "Cannot start your application. The workgroup information file is missing or opened exclusively by another user.". (Microsoft SQL Server, Error: 7399)
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=10.50.3720&EvtSrc=MSSQLServer&EvtID=7399&LinkId=20476
------------------------------
BUTTONS:
OK
------------------------------
显然我是唯一连接到该数据库的用户,所以我会说该文件不是由其他人以独占模式打开的,也不是由我打开的,因为我通过Mode=Read参数以只读模式访问它提供者字符串。
它所指的工作组信息文件是什么?这是实际的问题还是可能是更广泛的错误消息,问题可能出在其他地方?
我用下面的 SQL 脚本解决了这个问题。我的 Access 是 2013 MS Access 64 位和 SQl Server 是 2014。
创建无密码访问的链接服务器
使用访问密码创建链接服务器
看起来在我写这篇文章的时候,使用 SQL Server 用户时无法传递 Windows 安全凭据。SQL Server 用户将始终使用运行服务的 Windows 帐户的凭据。
在大多数情况下,它甚至不是实际用户,因为它只是一个服务帐户,无法绑定到域控制器以授予额外权限。
我的解决方案是将这些 Access 文件移动到运行 SQL Server 的同一台服务器并在本地打开它们。