OPENROWSET BULK共享文件夹的权限

时间:2013-02-05 14:53:04

标签: sql-server sql-server-2008 sql-server-2008-r2 bulk-load network-security

目的

使用OPENROWSET功能在查询中对文本文件加入数据。

错误

this question上利用@gbn的答案我试图像OP一样打开一个行集;虽然文件的格式有点不同。但是,我在尝试访问共享文件夹时遇到以下错误:

  

Msg 4861,Level 16,State 1,Line 1

     

无法批量加载,因为无法打开文件“\ MACHINENAME \ Share \ EC04.txt”。操作系统错误代码5(访问被拒绝。)。

背景

请理解,我不会访问SQL服务器,因此我无法将文件放在那里。

该文件驻留在Windows 7 x64计算机上。

该文件夹已与Read/Write分享为Everyone

问题

有人可以帮我理解我需要提供哪些其他安全性才能让SQL服务器访问此文件夹?

3 个答案:

答案 0 :(得分:9)

如果您以SQL登录身份登录,那么您必须create a credential才能进行此登录,并且此凭据必须具有足够的权限才能读取共享。

如果您以Windows登录身份登录,则必须为SQL Server服务帐户启用Kerberos约束委派。

现在看起来你正在使用Windows登录,并且由于模拟的上下文无法通过“双跃点”流,因此身份验证解析为ANONYMOUS LOGON,它不是Everyone的成员,因此拒绝访问。所有这些都是预期的行为。有关如何为定义所需共享的SQL Server服务帐户设置约束委派,请咨询您的网络管理员。

答案 1 :(得分:2)

我遇到了使用SQL DNS-Alias引起的同样问题。使用Servername \ Instance,使用ServerAlias \ Instance,我得到Operating system error code 5(Access is denied.).

答案 2 :(得分:0)

在SQL Server 2017上需要执行以下步骤,以使OPENROWSET ('Microsoft.ACE.OLEDB.16.0','Excel 12.0;..)与共享文件夹(UNC文件共享)一起使用:

  1. 安装Microsoft Access Database Engine 2016 Redistributable
  2. Configure the Service Principal Name (SPN) in Active Directory(因为我们使用Kerberos身份验证):
    1. 配置Computer object(数据库服务器的)安全权限
    2. 配置Service account安全权限(运行SQL Server进程的用户)
    3. 检查SQL Server日志中是否有类似以下消息:SQL Server网络接口库已成功为SQL Server服务注册了服务主体名称(SPN)[MSSQLSvc / SRV-DB-01.domain.local:58089]。 / li>
  3. 允许Hoc Distributed Queries
  

EXEC sp_configure 'show advanced options', 1 RECONFIGURE GO EXEC sp_configure 'ad hoc distributed queries', 1 RECONFIGURE GO

  1. 使用AllowInProcessDynamicParameters配置驱动程序“ Microsoft.ACE.OLEDB.16”
  

USE [master] GO EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'AllowInProcess', 1 GO EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'DynamicParameters', 1 GO

  1. 由于我们启用了AllowInProcess,因此服务帐户必须具有C:\Users\service-account\AppData\Local\Temp上的临时文件夹的修改权限。否则,您可能会收到提供者报告了意外的灾难性故障
  2. 确保您对UNC共享本身具有适当的权限。
  3. 重新启动服务器,以确保应用了AD和临时文件夹权限的所有更改!
  4. 使用实际的数据库服务器名称进行连接。不要使用SQL别名。