我为这类问题提供了几个条目,但似乎没有人为我解决这个问题。
我的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身份验证运行并失败。
但为什么呢?我无法理解安全问题。
有什么想法吗?
答案 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进程的配置文件