如何使用 INSERT INTO OPENROWSET 导出到 Excel,而无需成为目标服务器上的管理员

Wes*_*all 6 windows sql-server file-permissions sql-server-2014

我正在尝试授予用户使用 OPENROWSET 将数据从 SQL Server 导出到 Excel 文件的权限。

用户收到以下错误:

无法为链接服务器“(null)”初始化 OLE DB 访问接口“Microsoft.ACE.OLEDB.12.0”的数据源对象。

我们可以重现运行以下代码块的问题,我可以成功运行而用户不能:

    INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml; HDR=YES;IMEX=0; Database=\\servername\exportdirectory\exportfile.xlsx', 'Select ExcelColumn from [TabName$]')
    SELECT TOP 1 SQLColumn FROM SQLTable
Run Code Online (Sandbox Code Playgroud)

我在用户之间看到的唯一区别是,能够成功运行此命令并将数据导入 Excel 的用户是托管 SQL 实例和目标目录的 Windows 服务器上的管理员。

无法运行代码的用户对excel文件所在的目标文件目录具有完全控制权限,对SQL实例具有sysadmin权限。

有没有办法允许这个用户写入这个文件而不授予 Windows 服务器本身的完整服务器管理员权限?

ben*_*its 3

根据 MS 文档,执行该命令的用户需要管理员批量操作。这是服务器级别的权限-bulkadmin。因此,您必须让任何将要执行此操作的用户担任此角色(在服务器级别),但不一定使他们成为 DBA。

https://learn.microsoft.com/en-us/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-2017:OPENROWSET 权限由正在使用的用户名的权限决定传递给 OLE DB 提供程序。要使用 BULK 选项需要 ADMINISTER BULK OPERATIONS 权限。

如果您无法做到这一点(将用户置于 BulkAdmin 角色中),您可能需要使用 SSIS 创建电子表格。