简体   繁体   English

没有DSN的情况下如何创建与MySQL的SQL Server链接服务器?

[英]How can I create a SQL server linked server to MySQL without a DSN?

I would like to create a linked server to MySQL but I prefer not to reference a DSN because it's more management overhead to set that up. 我想创建一个到MySQL的链接服务器,但是我不想引用DSN,因为设置它会增加管理开销。 In many environment I can usually replace a DSN with a connection string that has all the bits of data that would normally be configured and saved with the DSN. 在许多环境中,我通常可以用连接字符串替换DSN,该连接字符串具有通常由DSN配置和保存的所有数据位。 With MySQL linked servers I have not been successful. 使用MySQL链接服务器时,我没有成功。

My last attempt uses this (sanitized) script: 我的最后一次尝试使用以下(消毒)脚本:

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

This script runs and creates the linked server object but when I attempt to run a query like this: 该脚本运行并创建链接的服务器对象,但是当我尝试运行这样的查询时:

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

I get this error: 我收到此错误:

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

Is this technique even valid and if so what changes are required to make it work? 这项技术是否有效?如果需要,需要进行哪些更改才能使其生效?

You can define a Linked Server in SQLServer without a DSN for sure. 您可以确保在没有DSN的SQLServer中定义链接服务器。 In my case, I've found dealing with DSN was a waste of time (the issue being the character pages used here and there; how can we be in XXI sicle in and this being still unresolved by vendors!!??) so just used the "Provider String" instead. 以我为例,我发现处理DSN是浪费时间(问题是在这里和那里使用的字符页面;我们如何进入XXI sicle,而供应商仍未解决!!!)改用“提供商字符串”。

So, the bare minimum information needed is: - Provider: I've used "Microsoft OLE DB Provider for ODBC Drivers" - Product name: "MySQL" if that's the DB you want to link to - Provider string: here you state the Driver to use, Server and Port to connect to (Port may not be required if using defaults, not 100% sure), Username and password (it will be clear text I'm afraid, so better use a dedicated credential for this) 因此,所需的最少信息是:-提供程序:我使用了“用于ODBC驱动程序的Microsoft OLE DB提供程序”-产品名称:“ MySQL”(如果您要链接到该数据库)-提供程序字符串:此处说明了驱动程序要使用的服务器和要连接的端口(如果使用默认端口,则可能不需要端口,但不能100%确定),用户名和密码(恐怕是明文,因此最好使用专用凭据)

And that's all. 就这样。 You can specify something else like Database to connect to, or other "Option" values (check MySQL's ODBC Connector info for this). 您可以指定其他内容,例如要连接的数据库或其他“选项”值(为此请检查MySQL的ODBC连接器信息)。

Thus, in Matthew Macfarland's case above it would be something like this: 因此,在上述Matthew Macfarland的案例中,将是这样的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM