Как использовать INSERT INTO OPENROWSET для экспорта в Excel, не будучи администратором на целевом сервере - PullRequest
4 голосов
/ 18 июня 2019

Я пытаюсь предоставить пользователю доступ к экспорту данных из SQL Server в файл Excel с помощью OPENROWSET.

Пользователь получает следующую ошибку:

Невозможно инициализироватьобъект источника данных поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)".

Мы можем воспроизвести проблему, выполнив следующий блок кода, который я могу запуститьуспешно, и пользователь не может:

    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

Единственное различие, которое я вижу между пользователями, состоит в том, что те, кто может успешно выполнить эту команду и получить данные в Excel, являются администраторами на сервере Windows, на котором размещены оба экземпляра SQL.и целевой каталог.

Пользователь, который не может выполнить код, имеет права полного доступа к целевому файловому каталогу, в котором находится файл excel, и имеет разрешения sysadmin для экземпляра SQL.

Есть ли способ разрешитьэтого пользователя для записи в этот файл без предоставления полных прав администратора сервера на самом сервере Windows?

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Вы испытываете "проблему двойного прыжка".Необходимо включить олицетворение, чтобы сервер, на котором размещен общий ресурс, принимал олицетворенные учетные данные от SQL Server.Вот выдержка из раздела соображений безопасности на этой странице: Импорт массовых данных с помощью BULK INSERT или OPENROWSET (BULK ...) (SQL Server)

SQL Server иMicrosoft Windows можно настроить так, чтобы экземпляр SQL Server мог подключаться к другому экземпляру SQL Server путем пересылки учетных данных аутентифицированного пользователя Windows.Эта договоренность известна как олицетворение или делегирование.Понимание того, как версия SQL Server обеспечивает безопасность для олицетворения пользователя, важно при использовании BULK INSERT или OPENROWSET.Олицетворение пользователя позволяет файлу данных находиться на компьютере, отличном от процесса SQL Server или пользователя.Например, если пользователь на Computer_A имеет доступ к файлу данных на Computer_B, и делегирование учетных данных было установлено соответствующим образом, пользователь может подключиться к экземпляру SQL Server, который работает на Computer_C, получить доступ к файлу данных на Computer_B,и массовый импорт данных из этого файла в таблицу на Computer_C.

Эта страница может помочь вам начать работу: Обзор ограниченного делегирования Kerberos

3 голосов
/ 18 июня 2019

Согласно документации MS, пользователь, выполняющий команду, нуждается в массовых операциях администратора. Это разрешение уровня сервера - bulkadmin. Таким образом, вы должны поместить любого пользователя, который собирается сделать это, в эту роль (на уровне сервера), не обязательно делать его администратором баз данных.

https://docs.microsoft.com/en-us/sql/t-sql/functions/openrowset-transact-sql?view=sql-server-2017: Разрешения OPENROWSET определяются разрешениями имени пользователя, которое передается поставщику OLE DB. Для использования параметра BULK требуется разрешение ADMINISTER BULK OPERATIONS.

Если вы не можете этого сделать (поместите пользователя в роль BulkAdmin), вы можете использовать SSIS для создания электронной таблицы.

...