2016-06-28 44 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时它运行良好。查看更新的帖子。所以,它*可以*使用映射的驱动器。但是,显然存在安全问题。 –