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”没有大写:
为了解决这个问题,我:
- 已按照说明删除注册表值
- 重新启用
Disallow AdHoc Access
选项(重新创建注册表值)
- 手动将注册表
DisallowAdHocAccess
值设置为“0”
问题已解决!
我们广泛使用 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”没有大写:
为了解决这个问题,我:
- 已按照说明删除注册表值
- 重新启用
Disallow AdHoc Access
选项(重新创建注册表值)
- 手动将注册表
DisallowAdHocAccess
值设置为“0”
问题已解决!