為 BULK INSERT 配置無約束委派
我在 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 中發生了一些變化以使這些指南過時?
- 文件伺服器安全事件日誌條目
- 服務帳戶委派
- 服務帳戶 SPN
- SQL Server #1 電腦帳戶委派
- 文件伺服器 #2 電腦帳戶 SPN
- 組策略對象
sys.dm_exec_connections
- Kerberos我可以確認此 GPO 已通過 應用到 MSSQL1
gpresult.exe /R
,並且 SQL 和文件伺服器節點都在之後重新啟動以確保已刷新所有記憶體。
您的配置看起來很可靠。SPNs 和委派的配置就像我自己做的那樣。
您唯一沒有解釋的是文件/共享權限。這就是我的解決方案介入的地方。
解決方案 1(個人帳戶)
- 驗證是否允許您的個人帳戶訪問文件伺服器共享上的文件
您的個人帳戶至少需要共享權限級別的讀取權限,或者在大多數情況下,您可能會看到每個人都具有讀取權限。
您的個人帳戶至少需要文件權限級別的 READ 權限
在文件級別檢查該文件的權限繼承
- 更改文件權限後重新啟動 SQL Server 或循環 SQL Server 服務。
或者:使用您的個人帳戶登錄 SQL Server並連接到共享並打開文件。
- 使用您的個人帳戶 打開 SSMS 。
- 使用 Windows 身份驗證打開與 SQL Server 實例的連接。
- 使用您之前使用的腳本驗證您是否已使用 SQL Server 服務帳戶連接到您的實例。
- 使用 BULK INSERT 執行導入
解決方案 2(SQL Server 服務帳戶)
- 驗證是否允許SQL Server 服務帳戶訪問文件伺服器共享上的文件
SQL Server 服務帳戶至少需要共享權限級別的讀取權限,或者在大多數情況下,您可能會看到每個人都具有讀取權限。
SQL Server 服務帳戶至少需要文件權限級別的 READ權限
在文件級別檢查該文件的權限繼承
- 更改文件權限後重新啟動 SQL Server 或循環 SQL Server 服務。
或者:使用 SQL Server 服務帳戶登錄到 SQL Server 並連接到共享並打開文件。
- 使用SQL Server 服務帳戶
打開 SSMS 。
- 執行:your_domain \ SQL_Server_service_account
- 提供密碼
- 使用 Windows 身份驗證打開與 SQL Server 的連接。
- 使用您之前使用的腳本驗證您是否已使用 SQL Server 服務帳戶連接到您的實例。
- 使用 BULK INSERT 執行導入
批量插入權限
安全帳戶委派(模擬)
如果使用者使用 SQL Server 登錄,則使用 SQL Server 程序帳戶的安全配置文件。無法在數據庫引擎之外對使用 SQL Server 身份驗證的登錄進行身份驗證。因此,當使用 SQL Server 身份驗證的登錄名啟動 BULK INSERT 命令時,將使用 SQL Server 程序帳戶(SQL Server 數據庫引擎服務使用的帳戶)的安全上下文建立與數據的連接。要成功讀取源數據,您必須**授予 SQL Server 數據庫引擎使用的帳戶對源數據的訪問權限。相反,如果 SQL Server 使用者使用Windows 身份驗證登錄,則該使用者只能讀取該使用者帳戶可以訪問的那些文件,**無論 SQL Server 程序的安全配置文件如何。
根據我的委派經驗,SQL Server 服務帳戶需要適當的權限才能代表您嘗試訪問的共享。您是否調整了這些權限?我認為只讀就足夠了。