2013-12-16 2 views
3

Я пытаюсь запустить ниже заявление:Использование SQL Credential открыть файл с OpenRowset

INSERT INTO table SELECT * FROM 
OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0; 
Database=//server/folder/file.xls; 
HDR=YES;', 
'SELECT * FROM [Sheet1$]') 

Однако я получаю ошибку ниже:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine cannot open or write to the file '\\server\folder\file.xls'. It is already opened exclusively by another user, or you need permission to view and write its data.". 

Msg 7303, Level 16, State 1, Line 1 
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

Я бегу SQL Server 2005 на 32-битной машине. Выполняемый код в конечном итоге будет с кодом C# на веб-сервере IIS6. Однако в настоящее время я просто пытаюсь запустить его на SQL Server. Я зарегистрировался на SQL Server с использованием SQL Auth, но к файлу должен быть доступен Windows Auth, специфичный для диска общего доступа (учетная запись AD в нашей сети). Ad-Hoc priveleges были предоставлены учетной записи SQL Auth, чтобы разрешить OPENROWSET.

Я попытался добавить UID=user;PASS=pswd в OPENROWSET код, как показано ниже:

INSERT INTO table SELECT * FROM 
    OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0; 
    Database=//server/folder/file.xls; 
    HDR=YES; 
UID=user; 
PASS=pswd', 
    'SELECT * FROM [Sheet1$]') 

Это дало ту же ошибку. Я также установил SQL CREDENTIAL с идентификатором пользователя и проходом учетной записи Active Directory Windows auth с доступом к этому файлу общего доступа, но ошибка осталась.

Я рассматривал использование прокси-сервера, но это не работа агента сервера sql. Это специальный вызов.

Я также вошел в SQL Server с использованием Windows Auth с пользователем, имеющим права на общий ресурс, и получаю ту же ошибку.

Я исследовал это много, но не могу найти ответ, который работает. Посредством моих поисков кажется, что это проблема многих людей. Любая помощь будет оценена. Я в тупике.

+0

Просьба представить информацию об операционной системе сервера. Это 32 или 64-битная архитектура? Установили ли вы надлежащие драйверы OleDb?Где вы пытаетесь выполнить вышеуказанный запрос: на стороне сервера на локальном компьютере? –

+0

@MaciejLos Это 32-битная архитектура. OleDb отлично работает без использования диска общего доступа, как указано, поэтому я знаю, что эти драйверы работают нормально. Также отмеченный выше, я в конечном итоге выполним из кода C#, запущенного как CodeBehind на веб-сервере. На данный момент, однако, я просто хочу, чтобы это работало, когда я запускаю общий SQL-запрос adhoc, зарегистрированный с использованием SQL Server Auth. Я запускаю студию управления для запуска запроса. – steventnorris

+0

[MSDN wrote:] (http://technet.microsoft.com/en-us/library/ms175915.aspx) Для использования BULK INSERT или INSERT ... SELECT * FROM OPENROWSET (BULK ...) для массового импорта данных с другого компьютера файл данных должен быть разделен между двумя компьютерами. Чтобы указать общий файл данных, используйте его имя универсального названия (UNC), которое принимает общую форму, \\ имя_сервера \ имя_архива \ путь \ имя_файла. Кроме того, ** учетная запись, используемая для доступа к файлу данных, должна иметь разрешения, необходимые для чтения файла на удаленном диске **. –

ответ

1

Я уверен, что при использовании OpenRowSet пользователь службы SQL Server, который нуждается в доступе к файлу, является пользователем службы.

И поскольку кажется, что вы пытаетесь получить доступ к файлу на другом сервере, может возникнуть проблема заставить его работать, если SQL-сервер работает как локальная система или другая локальная учетная запись пользователя.

Я несколько раз решил это, изменив SQL-сервер для запуска как пользователь AD (с его последствиями безопасности), а затем предоставил этому пользователю доступ к файлу в сети или поместил внешний файл (в в этом случае Excel) на том же компьютере, что и SQL-сервер.

+0

У меня нет возможности переместить файл на SQL Server, хотя он отлично работает, если он есть. Вы правы, что доступ к другому серверу является проблемой здесь. Я пытаюсь не регистрироваться в качестве пользователей AD, но мне, возможно, придется идти по этому маршруту, если нет другого пути. Учетные данные влияют на openrowset вообще? Этот сайт http://www.jasonstrate.com/2013/07/security-questions-logins-credentials-and-proxies/, по-видимому, указывает, что учетные данные могут использоваться для доступа к файлам на других серверах. – steventnorris

+0

Если оба компьютера находятся в одном домене, вы можете предоставить учетную запись Local System (или любую другую учетную запись, на которой работает SQL Server) на компьютере SQL Server, на доступ к общему ресурсу // сервера/папки. –

+0

Как определить, на какой учетной записи работает SQL Server? – steventnorris

0

Существует возможность использовать 2 различных connection strings:

  1. ACE OLEDB 12,0
  2. или
  3. JET OLEDB 4,0

Попробуйте оба способа.

Иногда Excel содержит непиговый тип данных. Попробуйте прочитать целые данные в виде текста, используя опцию «IMEX = 1».

В случае дальнейших вопросов, попробуйте ниже решений:
Linked Server using Microsoft.Jet.OLEDB.4.0 problem
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)"

Смежные вопросы