我正在尝试运行 BULK INSERT 但我收到拒绝访问错误。到目前为止,我已经尝试了以下方法:
- 我可以从我的机器上打开文件
- 我已使用 windows auth 登录到 SQL Server(已尝试 v2008 R2 和 v2016)
- 我有系统管理员权限
- 我可以
type
使用 xp_cmdshell 文件(使用 SQL 服务帐户,但它消除了它是防火墙的想法) - 路径是网络 URL 而不是本地驱动器
我正在使用的命令是这样的:
BULK INSERT ken_temp
FROM '\\network_path\temp\kdf\text_file.txt'
WITH
(
FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
,ROWS_PER_BATCH = 50000
,MAXERRORS = 10
)
有任何想法吗?
问题是:
您正在使用 Windows 身份验证登录:这意味着 SQL Server 将尝试模拟您的 Windows / 域帐户来访问文件系统。
您已直接登录到工作站,然后远程连接到 SQL Server:这意味着您通过将身份验证令牌从工作站传递到运行 SQL Server 的服务器间接连接到运行 SQL Server 的服务器。
您尚未为 SQL Server 启用委派:这意味着您被默认行为所困扰,即不允许将该令牌传递超过直接登录的 1 步。
您正在尝试读取存在于远程资源上的文件:这意味着它超出了您直接登录的位置超过 1 步。
这就是为什么您可以很好地从工作站访问文件的原因。这就是为什么 using
xp_cmdshell
也有效的原因,因为服务帐户直接登录到运行 SQL Server 的服务器,而远程资源仅一步之遥。我怀疑如果您要将远程桌面直接连接到运行 SQL Server 的服务器上,在该服务器上运行 SSMS,然后执行
BULK INSERT
,它会成功。或者,如果您设置 SQL Server 登录,它也应该可以工作,授予登录“批量管理员”权限,EXECUTE AS Login = 'JustReadTheDangFileAlready';
然后执行BULK INSERT
. 当执行BULK INSERT
/OPENROWSET (BULK...)
作为 SQL Server 登录时,没有要模拟的 Windows 帐户,因此使用服务帐户完成文件系统访问,就像xp_cmdshell
.您有以下选择:
为 SQL Server 启用委派(不记得是针对服务还是帐户,在这种情况下,可能是您的 Windows 帐户需要它,但有关于如何设置的指南,包括设置 SPN) . 我相信这是首选/推荐的选择。这允许进程将身份验证令牌转发到从直接登录中进一步删除的资源。
为此过程使用 SQL Server 登录。我不敢相信我在建议这个,但是如果您有一个 SQL Server 登录名,该登录名是“批量管理员”固定服务器角色或具有正确的“批量管理员”权限,那么您可以为此创建关联的用户登录(在适当的数据库中),并将 放在
BULK INSERT
使用WITH EXECUTE AS 'JustReadTheDangFileAlready'
. 然后你可以执行那个应该掩盖请求来自 Windows 帐户的过程。打开该远程文件(也许还有文件夹?)的权限。您可以将“读取”权限授予“所有人”(也可以授予“读取”权限或对该文件夹的其他权限)。
删除此问题并使用此“错误”作为需要通过 HBA 卡连接并显示为本地驱动器的昂贵 SAN 的理由?。只需告诉首席财务官:“这确实是唯一的方法。互联网是这么说的。”