【问题标题】:BULK INSERT returns error "Access is denied"BULK INSERT 返回错误“访问被拒绝”
【发布时间】:2018-03-13 13:53:35
【问题描述】:

运行批量插入时

BULK INSERT MyDatabase.dbo.MyTable 
FROM '\\Mylaptop\UniversalShare\SQLRuleOutput.csv' 
WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')

在远程 SQL Server 上出现此错误:

"无法批量加载,因为文件 无法打开“\MyLaptop\UniversalShare\SQLRuleOutput.csv”。 操作系统错误代码 5(访问被拒绝。)。”

  • 共享对所有人开放。
  • 我已在连接到同一共享的那个 SQL Server 上运行 PowerShell Invoke-SQLCMD 脚本,因此服务器可以看到该共享。
  • 无论我是直接在 SQL Server 上将其作为 T-SQL 运行,还是通过 PowerShell Invoke-SQLCMD(这是我的预期方法)运行,此 Bulk Insert 语句都会失败并出现相同的错误。

这个问题很相似,Cannot bulk load. Operating system error code 5 (Access is denied.),但在我的情况下,共享对所有人开放,所以权限不应该成为问题,而且共享肯定在不同的地方(我的用于 POC 开发的笔记本电脑)而不是 SQL Server。

有谁知道为什么会发生这个错误,或者如何解决它?

谢谢,

康拉德

【问题讨论】:

  • PS:如果我将所有数据编写为 Insert 语句,那么 SQL Server 会正确导入所有数据,但我的源数据是 .csv 格式。

标签: sql-server bulkinsert


【解决方案1】:

运行 MSSQL 服务的 Windows 帐户必须可以访问该共享;通常是本地系统或网络服务(但可以是任何东西)。您不太可能明确授予对本地文件共享的 MYSERVER\LOCAL SERVICE 的访问权限。

运行 Powershell Invoke-SQLCMD 并不能证明 MSSQL 服务有权访问您的驱动器 - 这取决于您运行 power shell 的帐户。

【讨论】:

  • 共享对每个人都是读/写的。 SQL Server 在“NT Service\MSSQLSERVER”下运行。我是否需要,是否有任何方法可以显式添加该 NT 服务帐户以对共享具有读/写权限?
  • 该帐户不太可能具有访问权限,因为它不是域帐户。不要给它访问权限。正确的方法是创建一个适当的服务帐户并使用它。你在使用活动目录吗?如果没有,则很难正确管理这些权限问题。
  • Execute As (myself) 返回相同的错误“访问被拒绝”,因此 Bulk Insert 仅作为服务帐户运行。我自己运行的 TSQL 和 PowerShell 语句。在这种情况下,我们无法更改该服务帐户,因此我的解决方法可能是生成一系列 Insert Into 语句。这样做的数据并不多。
  • @ConradS.,您可以使用 PowerShell 脚本中的 SqlBulkCopy 而不是 T-SQL BULK INSERT,以便客户端处理文件而不是数据库引擎。这将比单个插入更快。
  • 更好的解决方案是在服务器上打开文件共享并将您的数据从笔记本电脑/PC 复制到“投递箱”。这意味着 SQL Server 只需要打开本地存储的数据的文件句柄(更快),并且不需要在导入期间打开连续的网络文件(更具弹性)。
猜你喜欢
  • 2015-06-25
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多