【问题标题】:How to create linked server on remote server to local PC如何在远程服务器上创建链接服务器到本地 PC
【发布时间】:2017-09-21 06:58:25
【问题描述】:

如何添加从远程 SQL Server 链接到本地​​ SQL Server Express 实例的链接服务器建立连接?本地是指我与 SQL Server Express 实例一起使用的 PC,远程是指我使用 SSMS 连接的服务器。大多数在网络上描述了相反的情况——从远程到本地。我从该文档开始: https://docs.microsoft.com/en-us/sql/relational-databases/linked-servers/create-linked-servers-sql-server-database-engine

  1. 我是否必须像对待远程服务器一样对待本地服务器?我的意思是我必须找到链接服务器的本地实例的IP地址吗?如果是,那么问题是如何找到本地服务器的必要参数以使其成为远程服务器?这个查询对我来说是一个有希望的开始https://stackoverflow.com/a/14695530/1903793 但是我得到了 local_net_address、local_tcp_port 和 client_net_address 的空值。所以我被困住了。
  2. 请看下图。在链接服务器字段中输入什么? .\SQLExpress 或其他短语。
  3. SQL ServerOther data source该选什么?
  4. 如果是其他数据源,那么提供者呢?

【问题讨论】:

  • 你没有写任何关于你的网络设置的内容。远程服务器是在您的 LAN 中还是在 Internet 中?我认为您的问题与网络/防火墙/nat/路由有关,而不是 sql-server。
  • @MatSnow Remote 在互联网上。假设我们可以根据需要调整远程服务器的网络设置。但是我认为重点应该放在本地 PC 的设置上,如何使其对网络可见,而不是在远程服务器上。
  • how to make it visible to net - net 是什么意思?局域网、互联网?
  • @MatSnow 互联网。
  • 如果您的本地 PC 已经是 configured 可以通过 TCP/IP 访问,那么问题就是如何配置您的防火墙/路由器以使您的服务器对 Internet 可见。这取决于您的设置,尤其是您的网络硬件。没有任何进一步的信息就无法回答这个问题,我认为这与 SO 无关。

标签: sql sql-server sql-server-2012 sql-server-2016 linked-server


【解决方案1】:

如果您发现“从远程到本地”,这与您想要的相反,只需想象您的 PC 是服务器,而服务器是本地 PC,然后就可以了。 假设您有 2 台机器:machine1 和 machine2。 将 machine1 上的链接服务器添加到 machine2 :只需在 machine1 上打开新的链接服务器页面即可。 链接服务器:(Machine2 IP 地址) (已选择)SQL 服务器

转到安全页面并选择:使用此安全上下文进行。 并输入您从 machine2 上的 SQL 服务器实例中获得的用户名和密码。

【讨论】:

    【解决方案2】:
    1. 是的。它是您本地的,而不是您要创建链接服务器的其他 SQL Server。对于另一台服务器,您的本地服务器是远程的。确保您的本地服务器可以使用 SQL Server 配置管理器接受网络连接。

    2. 如果您使用 SQL Server,则必须提供本地服务器的网络名称 - 您在 SSMS 中使用的名称。除非您使用 localhost 或“。”然后你需要找到它,你可以使用ipconfig /all 并查找主机名。假设您的本地服务器和其他服务器都在同一个网络上,这将起作用。 使用其他服务器,您有更多选择。在链接服务器中,您提供您喜欢的任何内容,然后在下面指定连接信息。 Here you can find more information about values

    3. 您可以选择您的方案允许的内容。可以的话选择Sql Server

    4. 查看 pt.2 中的链接

    编辑:

    免责声明我不是网络工程师,所以我可能会遗漏一些关键步骤来使其真正发挥作用,这只是大方向。

    如果您在其他网络上而不是其他服务器上,则必须在 1433 TCP 端口上打开防火墙,不仅在您的机器上,而且在路由器上,并将路由器的端口 1433 映射到您机器的端口 1433。然后让您的路由器公共 IP您应该能够链接两个服务器。这有点超出了@MatSnow 在他的评论中提到的范围。

    【讨论】:

      【解决方案3】:

      我不会谈论你的IP,因为很明显你必须有一个公共/可访问的IP这是一个先决条件

      1. 您必须在您的 SQL Server 中启用 TCP/IP 协议,这样您的服务器才能接受不是来自本地主机的请求。您可以在 Sql Server 配置管理器 中进行操作,如下图所示

      1. 一旦完成,您必须在防火墙中打开端口 1433,这样连接就不会被阻止,如您所见 here

      2. 此时您只需像往常一样通过IP/实例

      3. 添加链接服务器

      【讨论】:

        【解决方案4】:

        正如其他人指出的那样。它的很多答案和成功取决于两台机器的通信能力。那么DNS配置了吗?防火墙?你能ping通吗?你能解析机器名称吗?您能否以其他方式从一台服务器与另一台服务器通信?从本地计算机和远程服务器创建链接服务器(反之亦然)的区别实际上只是颠倒信息。您的本地计算机仍然需要是具有适当配置和授予权限的服务器,但如果是,那么它只是另一个 SQL 服务器。一个链接服务器只依赖于拥有 2 个能够通信的 SQL 服务器。

        因为我经常远程工作 (VPN) 并且服务器不能总是解析我的机器 DNS 名称我使用以下脚本在远程服务器上创建一个链接服务器以通过 IP 地址连接到我的本地机器我通过以下方式连接到服务器SSMS:

        DECLARE @AutoExecute BIT = 1
        DECLARE @LinkedServerName VARCHAR(50) = 'LinkedServername' --if null or blank the linked server will just get the instance name
        DECLARE @InstanceAppend VARCHAR(45) = '\InstanceName' --make emptry string if none
        DECLARE @user VARCHAR(20) = 'username'
        DECLARE @password VARCHAR(20) = 'password'
        
        DECLARE @SQL VARCHAR(MAX)
        DECLARE @IPAddress VARCHAR(255)
        DECLARE @Instance VARCHAR(300)
        DECLARE @SrvName VARCHAR(300)
        
        SELECT @IPAddress = client_net_address
            ,@Instance = client_net_address + ISNULL(@InstanceAppend,'')
        FROM
            sys.dm_exec_connections
        WHERE Session_id = @@SPID;
        
        SET @SrvName = CASE WHEN LEN(@LinkedServerName) > 0 THEN @LinkedServerName ELSE @Instance END
        
        IF NOT EXISTS (SELECT * FROM sys.servers WHERE name = @SrvName)
        BEGIN
            IF (LEN(@LinkedServerName) > 0)
            BEGIN
                SET @SQL = 'EXECUTE master.dbo.sp_addlinkedserver @server = N''' + @LinkedServerName + ''',@provider=''SQLOLEDB'', @srvproduct=N'''', @datasrc=N''' + @Instance + ''''
            END
            ELSE
            BEGIN
                SET @SQL = 'EXECUTE master.dbo.sp_addlinkedserver @server = N''' + @Instance + ''', @srvproduct=N''SQL Server'''
            END
            SET @SQL = @SQL + CHAR(13) +  'EXECUTE master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N''' + @SrvName + ''',@useself=N''False'',@rmtuser=''' + @user + ''', @rmtpassword=''' + @password + ''''
        END
        ELSE
        BEGIN
            PRINT 'Linked Server Exists'
        END
        
        PRINT @SQL
        
        IF (@AutoExecute = 1)
        BEGIN
            BEGIN TRY
                EXECUTE (@SQL)
                PRINT 'Executed Successfully'
            END TRY
            BEGIN CATCH
                PRINT 'Failed To Execute'
                ;THROW
            END CATCH
        END
        

        【讨论】:

          猜你喜欢
          • 2020-04-28
          • 1970-01-01
          • 1970-01-01
          • 2020-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-26
          相关资源
          最近更新 更多