批量插入在SQL代理作业中失败,未找到文件

时间:2016-06-28 15:52:22

标签: sql-server bulkinsert sql-server-agent

我为这类问题提供了几个条目,但似乎没有人为我解决这个问题。

我的SQL SERVER和SQL SERVER AGENT服务都设置为相同的用户帐户。

我有一个存储过程执行以下操作(删除了错误检查)

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身份验证运行并失败。

但为什么呢?我无法理解安全问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

虽然您使用映射驱动器为映射驱动器创建安全性,但您可以使用映射驱动器进行批量插入。

但您可以使用UNC路径,但安全性是SQL Server帐户的安全性。

注意你在/ share旁边有一个正斜杠我认为这是一个错字

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'
    )
  

当使用SQL Server登录启动BULK INSERT命令时   身份验证,使用安全性进行数据连接   SQL Server进程帐户的上下文(SQL使用的帐户)   服务器数据库引擎服务)。要成功读取源数据   您必须授予SQL Server数据库引擎使用的帐户,   访问源数据。相反,如果SQL Server用户登录   使用Windows身份验证,用户只能读取那些文件   无论安全性如何,都可以通过用户帐户访问   SQL Server进程的配置文件

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