【问题标题】:How can I create a SQL server linked server to MySQL without a DSN?如何在没有 DSN 的情况下创建与 MySQL 的 SQL Server 链接服务器?
【发布时间】:2017-08-11 15:27:10
【问题描述】:

我想创建一个链接到 MySQL 的服务器,但我不想引用 DSN,因为设置它需要更多的管理开销。在许多环境中,我通常可以将 DSN 替换为连接字符串,该连接字符串包含通常使用 DSN 配置和保存的所有数据位。使用 MySQL 链接服务器我没有成功。

我的最后一次尝试使用了这个(清理过的)脚本:

USE [master]
GO

DECLARE @LinkedServer VARCHAR(20)

SET @LinkedServer = 'MYSQL_DSNLESS'

IF EXISTS ( SELECT  * FROM  sys.servers WHERE   [name] = @LinkedServer )
    EXEC sp_dropserver @server = @LinkedServer, @droplogins = 'droplogins'

EXEC master.dbo.sp_addlinkedserver 
     @server = @LinkedServer
    ,@srvproduct = @LinkedServer
    ,@datasrc = @LinkedServer
    ,@provider = N'MSDASQL'
    ,@provstr = N'DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=servername;PORT=3306;DATABASE=mysqlschemaname;USER=mysqlusername;PASSWORD=mysqlpassword;OPTION=3'
    ,@catalog = N'ecn'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @LinkedServer, @useself = N'False', @locallogin = NULL, @rmtuser = N'mysqlusername', @rmtpassword = 'mysqlpassword'

EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'collation compatible', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'data access', @optvalue = N'true'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'dist', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'pub', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'rpc', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'rpc out', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'sub', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'connect timeout', @optvalue = N'0'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'collation name', @optvalue = NULL
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'lazy schema validation', @optvalue = N'false'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'query timeout', @optvalue = N'0'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'use remote collation', @optvalue = N'true'
EXEC master.dbo.sp_serveroption @server = @LinkedServer, @optname = N'remote proc transaction promotion', @optvalue = N'true'
GO

此脚本运行并创建链接服务器对象,但是当我尝试运行这样的查询时:

SELECT * FROM OPENQUERY(MYSQL_DSNLESS, 'SELECT * FROM mysqlschemaname.table01')

我收到此错误:

OLE DB provider "MSDASQL" for linked server "MYSQL_DSNLESS" returned message "[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "MYSQL_DSNLESS".

这种技术是否有效?如果有效,需要进行哪些更改才能使其发挥作用?

【问题讨论】:

  • 你是问能不能做一个没有数据源的数据源?
  • 没有。我想创建一个没有 DSN 的链接服务器。
  • 在您的情况下,DSN 引用了 ODBC 连接,因此如果您使用的是 ODBC 数据源,则不能在没有 ODBC 数据源的情况下创建链接服务器。

标签: mysql sql-server odbc


【解决方案1】:

您可以在没有 DSN 的情况下在 SQLServer 中定义链接服务器。就我而言,我发现处理 DSN 是浪费时间(问题是这里和那里使用的字符页面;我们怎么能在 XXI sicle 中,而这仍然没有被供应商解决!!??)所以只是改为使用“提供者字符串”。

因此,所需的最少信息是: - 提供者:我使用了“Microsoft OLE DB Provider for ODBC Drivers” - 产品名称:“MySQL”如果这是您要链接的数据库 - 提供者字符串:在这里你说明要使用的驱动程序、要连接的服务器和端口(如果使用默认值,可能不需要端口,不是 100% 肯定),用户名和密码(恐怕是明文,所以更好为此使用专用凭据)

仅此而已。您可以指定其他内容,例如要连接的数据库,或其他“选项”值(请查看 MySQL 的 ODBC 连接器信息)。

因此,在上述 Matthew Macfarland 的案例中,它会是这样的:

EXEC master.dbo.sp_addlinkedserver @server = @LinkedServer ,@srvproduct = N'MySQL' ,@provider = N'MSDASQL' ,@provstr = N'DRIVER={MySQL ODBC 5.3 ANSI 驱动程序};SERVER=servername;PORT=3306;DATABASE=mysqlschemaname;USER=mysqlusername;PASSWORD=mysqlpassword;OPTION=3'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2018-07-19
    • 2023-03-31
    相关资源
    最近更新 更多