SQL 没有 SYSADMIN 角色的服务器 OPENROWSET

SQL Server OPENROWSET without SYSADMIN role

我们广泛使用 OPENROWSET 函数将 .CSV 和 Excel 文件导入我们的 SQL Server 2012 环境,使用 MSDASQL 或 ACE:

SELECT * 
FROM OPENROWSET ('MSDASQL',
                 'DRIVER={MICROSOFT access TEXT DRIVER (*.TXT, *.CSV)};', 
                 'SELECT * FROM E:\INCOMING\REPORT_EXTRACT.CSV') 

或使用 ACE:

SELECT * FROM     OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','TEXT;DATABASE=E:\INCOMING\;HDR=YES;', 'SELECT     * FROM [REPORT_EXTRACT.CSV]');

我们遇到经典错误消息:

Msg 7415, Level 16, State 1, Line 1
Ad hoc access to OLE DB provider 'MSDASQL' has been denied. You must access this provider through a linked server.

启用此功能的唯一解决方法是授予所述用户 SYSADMIN 角色 - 显然不理想。

文件的位置在服务器本身上,为此访问的用户确实拥有访问该文件夹的必要权限。 SQL 服务器服务在具有与桌面交互权限的本地系统帐户下 运行。

我们已经尝试了以下 workarounds/fixes 无济于事:

1 执行了以下代码:

EXEC master . dbo. sp_MSset_oledb_prop N’Microsoft.ACE.OLEDB.12.0′ , N’AllowInProcess’ , 1
GO

EXEC master . dbo. sp_MSset_oledb_prop N’Microsoft.ACE.OLEDB.12.0′ , N’DynamicParameters’ , 1
GO

*2 DisAllowAdHocAccess 注册表修复:

这是当前状态:

3 为上述用户添加 ADMINISTER BULK OPERATIONS 权限

我们的过程中有许多表达式和文件使用 OPENROWSET,因此 BULK INSERT、构建 SSIS 包、利用 Excel 文件作为链接服务器不是可行的选择。

有什么建议吗?

哇 - 经过多年的故障排除,我终于弄明白了!

控制 Ad-hoc 访问允许的注册表项值依赖于 DisallowAdHocAccess 在该句子中的大小写。

在我们的例子中,AdHoc 中的“A”没有大写:

为了解决这个问题,我:

  1. 已按照说明删除注册表值
  2. 重新启用 Disallow AdHoc Access 选项(重新创建注册表值)

  1. 手动将注册表 DisallowAdHocAccess 值设置为“0”

问题已解决!