Sql-Server

為 BULK INSERT 配置無約束委派

  • December 19, 2017

我在 Always On 可用性組中有一對 Microsoft SQL Server 2016 節點。我正在嘗試對BULK INSERT位於 Windows Server 2016 文件伺服器故障轉移群集上的文件執行(使用 SQL Server 2016 Management Studio 查詢),但出現以下錯誤:

消息 4861,級別 16,狀態 1

無法批量載入,因為無法打開文件“\nas2.my.domain\Microsoft SQL Server 2016 Enterprise\test.txt”。作業系統錯誤程式碼 5(拒絕訪問。)。

無論我使用活動節點名稱 ( nas2.my.domain) 還是故障轉移群集偵聽器 ( nas.my.domain),都會發生這種情況。

環顧四周後,我發現這是由於 SQL Server 由於與BULK INSERT.

如果您使用 Windows 身份驗證連接到 SQL Server,則 SQL Server 服務帳戶在連接到文件伺服器時會嘗試模擬您的使用者帳戶。如果您使用 SQL Server 身份驗證進行連接,它將作為 SQL Server 服務帳戶連接到文件伺服器。

如果未正確配置委派和模擬(預設狀態),SQL Server 服務將無法模擬您的使用者帳戶,並將回退到嘗試以匿名使用者身份連接到文件伺服器。

這可以通過查看文件伺服器上的安全事件日誌來確認。這些事實以及有關配置無約束和約束委派的指南記錄在這些連結中:

我已經嘗試按照thesqldude指南中的說明進行操作,但它仍然無法正常工作。

我嘗試訪問的數據庫BULK INSERT不是可用性組的一部分,因此只有 MSSQL1 節點應該是相關的。文件伺服器在 NAS2 節點上處於活動狀態。檢查文件伺服器上的事件日誌確實表明它仍然存在此問題,並且 SQL Server 正在嘗試以匿名使用者身份向文件伺服器進行身份驗證,而不是冒充我的使用者帳戶。

有誰知道出了什麼問題?或者,如果 SQL Server 2016 中發生了一些變化以使這些指南過時?

我可以確認此 GPO 已通過 應用到 MSSQL1 gpresult.exe /R,並且 SQL 和文件伺服器節點都在之後重新啟動以確保已刷新所有記憶體。

您的配置看起來很可靠。SPNs 和委派的配置就像我自己做的那樣。

您唯一沒有解釋的是文件/共享權限。這就是我的解決方案介入的地方。

解決方案 1(個人帳戶)

  1. 驗證是否允許您的個人帳戶訪問文件伺服器共享上的文件
  • 您的個人帳戶至少需要共享權限級別的讀取權限,或者在大多數情況下,您可能會看到每個人都具有讀取權限。

  • 您的個人帳戶至少需要文件權限級別的 READ 權限

  • 在文件級別檢查該文件的權限繼承

    • 更改文件權限後重新啟動 SQL Server 或循環 SQL Server 服務。
  • 或者:使用您的個人帳戶登錄 SQL Server並連接到共享並打開文件。

  1. 使用您的個人帳戶 打開 SSMS 。
  2. 使用 Windows 身份驗證打開與 SQL Server 實例的連接。
  • 使用您之前使用的腳本驗證您是否已使用 SQL Server 服務帳戶連接到您的實例。
  1. 使用 BULK INSERT 執行導入

解決方案 2(SQL Server 服務帳戶)

  1. 驗證是否允許SQL Server 服務帳戶訪問文件伺服器共享上的文件
  • SQL Server 服務帳戶至少需要共享權限級別的讀取權限,或者在大多數情況下,您可能會看到每個人都具有讀取權限。

  • SQL Server 服務帳戶至少需要文件權限級別的 READ權限

  • 在文件級別檢查該文件的權限繼承

    • 更改文件權限後重新啟動 SQL Server 或循環 SQL Server 服務。
  • 或者:使用 SQL Server 服務帳戶登錄到 SQL Server 並連接到共享並打開文件。

  1. 使用SQL Server 服務帳戶

打開 SSMS 。

  • 執行:your_domain \ SQL_Server_service_account
  • 提供密碼
  1. 使用 Windows 身份驗證打開與 SQL Server 的連接。
  • 使用您之前使用的腳本驗證您是否已使用 SQL Server 服務帳戶連接到您的實例。
  1. 使用 BULK INSERT 執行導入

批量插入權限

安全帳戶委派(模擬)

如果使用者使用 SQL Server 登錄,則使用 SQL Server 程序帳戶的安全配置文件。無法在數據庫引擎之外對使用 SQL Server 身份驗證的登錄進行身份驗證。因此,當使用 SQL Server 身份驗證的登錄名啟動 BULK INSERT 命令時,將使用 SQL Server 程序帳戶(SQL Server 數據庫引擎服務使用的帳戶)的安全上下文建立與數據的連接。要成功讀取源數據,您必須**授予 SQL Server 數據庫引擎使用的帳戶對源數據的訪問權限。相反,如果 SQL Server 使用者使用Windows 身份驗證登錄,則該使用者只能讀取該使用者帳戶可以訪問的那些文件,**無論 SQL Server 程序的安全配置文件如何。

參考:大容量插入 (Transact-SQL)

根據我的委派經驗,SQL Server 服務帳戶需要適當的權限才能代表您嘗試訪問的共享。您是否調整了這些權限?我認為只讀就足夠了。

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