Sql-Server

批量插入權限問題

  • June 8, 2020

嘗試在 2012 SP4 SQL Server 上使用批量插入時,我遇到了可怕的 Msg 4861 錯誤消息。“無法批量載入,因為無法打開文件“\PathToFileShare.d1.xxx.com\folder\file.dat”。作業系統錯誤程式碼 5(訪問被拒絕)

細節:

我有兩個不同的域,D1 和 D2。我有三台不同的電腦,SQL Server(在 D2 中)、文件伺服器(在 D1 中)和應用程序伺服器(在 D1 中)。

我正在嘗試從應用程序伺服器呼叫儲存過程,該儲存過程使用批量插入從文件伺服器獲取文件並插入到 SQL Server 中。

儲存過程從產生錯誤的應用程序中作為 D1\user1 執行。當從以 D1\user1 登錄的 SSMS 中的 D2 中的 SQL Server 呼叫時,它按預期工作,並且正確的記錄被插入到表中。如果我嘗試在 D2 中的任何其他機器上以 D1\user1 身份登錄 SSMS,執行會產生錯誤。

附加資訊:

  • 我無法提供 D2 中的 SQL Server 服務帳戶訪問 D1 中的任何內容。
  • 我可以確認 D1\user1 有權訪問他們嘗試從文件共享中讀取的文件。
  • 我從以下連結中看到了資訊: SQL Server Docs Additional Docs
  • 我們沒有使用 kerberos 身份驗證。

儲存過程的批量插入部分如下所示:

BULK INSERT BulkInsertDB.ExampleDomain.ExampleTable
FROM '\\PathToFileShare.d1.xxx.com\folder\file.dat'
WITH (
    ROWTERMINATOR = '0x0a'
    );

任何幫助將非常感激。

謝謝你。

BULK INSERT 始終模擬 Windows 登錄以進行文件訪問。但是您的配置是雙跳的,因此模擬需要 Kerberos。所以,如前所述,你被卡住了。

常見的解決方法是創建憑據和SQL 代理代理,並從 cmdexec 或 powershell SQL 代理作業步驟啟動負載。代理將使用儲存的憑據在本地登錄並執行作業,因此它不再是雙跳。

TSQL 作業步驟將不起作用,因為在這種情況下,LogonUser 不使用憑據,代理只是作為代理服務帳戶連接並執行 SQL Server 模擬作業所有者。

您還可以從應用程序伺服器訪問文件並將文件複製到數據庫伺服器,或者從客戶端驅動批量載入,例如使用BCPSqlBulkCopy

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