0

我们现在正在将所有生产数据库从 SQL Server 2005 32 位实例迁移到全新的 SQL Server 2012 64 位实例。

我们的开发人员仍然遭受的主要困难之一是链接服务器

我们有很多程序需要从文本、csv 或 excel 文件中获取一些数据,它的实现方式是使用链接服务器到文本文件,这样您就可以轻松地向文本文件抛出 select 语句并将其插入到桌子。

问题提出了 32 位服务器使用Microsoft.Jet.OLEDB.4.0驱动程序的文件位于对每个人都具有完全权限的剪切目录中,我们从未遇到安全问题。

在新的 64 位服务器上,我们添加了一个链接服务器,其语法如下:

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver 
    @server = N'TEMP_FILES_1'
    , @srvproduct=N''
    , @provider=N'Microsoft.ACE.OLEDB.12.0'
    , @datasrc=N'\\SERVER-APP01\BWA\TempFiles'
    , @provstr=N'Text'

笔记:

  • 数据源位于网络共享上。
  • MSSQL 服务作为域管理员帐户运行。
  • 我以域管理员的身份远程登录,当然也是本地管理员。
  • \\SERVER-APP01\BWA\TempFiles目录为每个人设置了完全访问权限。

现在,当我运行时,EXEC sp_testlinkedserver [TEMP_FILES_1]我收到以下错误消息:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "TEMP_FILES_1" returned message "'\\SERVER-APP01\BWA\TempFiles' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.".

这绝对是一个安全问题,但有趣的是,当我运行xp_cmdshell 'dir \\SERVER-APP01\BWA\TempFiles'它时,它会返回记录,很明显服务可以访问这个文件夹......

在我的本地计算机的另一端,我也有一个具有相同链接服务器的 64 位实例,它就像一个魅力!

我一直在互联网上寻找解决问题的方法,但似乎很少使用链接到文本文件的服务器,尤其是 64 位。

4

1 回答 1

0

我们必须先将文件复制到目标 SQL Server 系统上的驱动器,然后才能读取数据,如下所示:

EXEC xp_cmdshell 'net use y: \\[source directory path] [pw] /USER:[active user]'
EXEC xp_cmdshell 'copy y:\[source file] [destination directory]'
EXEC xp_cmdshell 'net use y: /delete'
于 2017-01-24T15:48:00.690 回答