2016-06-28 37 views
0

我有幾個條目,這種問題,並沒有一個似乎爲我解決它。大容量插入失敗SQL代理作業,文件未找到

我的SQL SERVER和SQL SERVER AGENT服務都設置爲相同的用戶帳戶。

我有一個存儲過程,其執行以下操作(錯誤檢查cruft的移除)

exec XP_CMDSHELL 'net use P: \\machine/share password /user:machine\user' 
exec XP_CMDSHELL 'dir p: /b /a-d-h-s > p:\dir.txt' 

CREATE TABLE #FilesTemp (Filename varchar(200)) 

BULK INSERT #FilesTemp 
FROM 'p:\dir.txt' 
WITH 
    (
     ROWTERMINATOR = '\n' 
    ) 

當我運行從SSMS存儲過程,它運行良好。當我通過作業運行它時,XP_CMDSHELL調用正常工作,並創建'dir.txt'文件。但批量插入失敗,錯誤3(找不到p:\ dir.txt)。

我登錄到SSMS,使用'sa'連接到SQL Server,並且作業歸sa所有。正在創建共享的用戶具有必要的權限。

更多信息:

有放置(然後刪除顯然)評論詢問我是不是從服務器計算機上運行SSMS與否。我嘗試過這個。

顯然,當我使用Windows身份驗證運行時,大容量插入失敗,但是作爲SA運行存儲過程時,它工作。代理正在使用Windows身份驗證運行並失敗。

但是爲什麼?我無法理解安全問題。

有什麼想法?

回答

0

雖然您正在使用映射驅動器爲映射驅動器創建安全性,但不能使用映射驅動器進行批量插入。

但是,您可以使用UNC路徑,但安全性是SQL Server帳戶的安全性。

注意你有一個正斜槓旁/股我相信這是一個錯字

exec XP_CMDSHELL 'net use P: \\machine\share password /user:machine\user' 
exec XP_CMDSHELL 'dir p: /b /a-d-h-s > p:\dir.txt' 


exec Xp_cmdshell 'move p:\dir.txt c:\dir.txt' 


CREATE TABLE #FilesTemp (Filename varchar(200)) 

BULK INSERT #FilesTemp 
FROM 'c:\dir.txt' 
WITH 
    (
     ROWTERMINATOR = '\n' 
    ) 

當BULK INSERT命令由登錄使用SQL Server 認證,連接到數據初始化是使用SQL Server進程帳戶(由SQL 服務器數據庫引擎服務使用的帳戶)的安全 上下文制定的。要成功讀取源數據 ,您必須授予SQL Server數據庫引擎使用的帳戶對源數據的訪問權限 。相比之下,如果SQL Server用戶使用Windows身份驗證登錄 ,則用戶只能讀取這些文件這 可以由用戶帳戶來訪問,不管SQL Server進程

https://msdn.microsoft.com/en-us/library/ms188365.aspx

+0

的安全 輪廓不幸的是,我得到一個登錄錯誤,當我嘗試。 –

+0

問題是批量複製是在SQL Server的安全上下文中完成的。你不能使用映射驅動器,只能使用unc路徑。如果服務器帳戶不能被授予訪問權限,那麼將該角色複製到本地驅動器並從那裏導入 – Mike

+0

顯然,使用sa登錄到SQL Server時它運行良好。查看更新的帖子。所以,它*可以*使用映射的驅動器。但是,顯然存在安全問題。 –