Sql-Server

如何從 SQL Server 2014 x64 連接到受密碼保護的 Access 2010 數據庫

  • September 6, 2016

我有以下情況:

  • 遠端伺服器共享文件夾上的 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 Server 使用者時無法傳遞 Windows 安全憑據。SQL Server 使用者將始終使用執行服務的 Windows 帳戶的憑據。

在大多數情況下,它甚至不是實際使用者,因為它只是一個服務帳戶,無法綁定到域控制器以授予額外權限。

我的解決方案是將這些 Access 文件移動到執行 SQL Server 的同一台伺服器並在本地打開它們。

我用下面的 SQL 腳本解決了這個問題。我的 Access 是 2013 MS Access 64 位和 SQl Server 是 2014。

創建無密碼訪問的連結伺服器

EXEC master.dbo.sp_addlinkedserver 
@server = N'LINKEDSVR',
@srvproduct=N'Smarthr', 
@provider=N'Microsoft.ACE.OLEDB.12.0',
@datasrc=N'path of db'

EXEC master.dbo.sp_addlinkedsrvlogin 
@rmtsrvname=N'LINKEDSVR',
@useself=N'False',
@locallogin=NULL,
@rmtuser=NULL,
@rmtpassword=NULL

使用訪問密碼創建連結伺服器

exec sp_addlinkedserver 
   @server = 'TestLinkServer', 
   @provider = 'Microsoft.ACE.OLEDB.12.0', 
   @srvproduct = 'Access',
   @datasrc = 'path of db', 
   @provstr = ';PWD=yourpassword'

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

引用自:https://dba.stackexchange.com/questions/139341