使用SQL凭据打开OpenRowSet文件

时间:2013-12-16 14:38:27

标签: sql security sql-server-2005

我试图运行以下声明:

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)".

我在32位计算机上运行SQL Server 2005。正在执行的代码最终将来自IIS6 Web服务器上的c#代码。但是,目前我只是想让它在SQL Server上运行。我使用SQL Auth登录到SQL Server,但必须使用特定于共享驱动器的Windows Auth(我们网络上的AD帐户)访问该文件。为了允许OPENROWSET,我们已经为SQL Auth帐户提供了Ad-Hoc priveleges。

我尝试将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$]')

这产生了同样的错误。我还设置了一个带有用户ID的SQL CREDENTIAL,并通过了可以访问该共享驱动器的Windows auth Active Directory帐户,但错误仍然存​​在。

我考虑使用代理,但这不是sql server代理作业。这是一个特别的电话。

我还使用Windows Auth使用具有共享权限的用户登录SQL Server,并获得相同的错误。

我对此进行了很多研究,但似乎无法找到有效的答案。通过我的搜索,这似乎是许多人的问题。任何帮助将不胜感激。我很难过。

2 个答案:

答案 0 :(得分:1)

我很确定当你使用OpenRowSet时,它是需要访问该文件的SQL Server的服务用户。

由于您似乎正在尝试访问另一台服务器上的文件,因此如果SQL服务器作为本地系统或其他本地用户帐户运行,则使其工作可能是一项挑战。

我有几次通过更改SQL服务器以作为AD用户运行(具有安全隐患)来解决这个问题,然后让该用户访问网络上的文件,或者放置外部文件(在此例如Excel)与SQL服务器在同一台计算机上。

答案 1 :(得分: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)"