管理关联的服务器

本页面介绍如何管理 Cloud SQL 实例上的关联服务器,包括注册实例、添加关联的服务器和查询关联的服务器。

注册实例以允许使用关联的服务器

如需向实例添加 cloudsql enable linked servers 标志,请使用以下命令:

gcloud sql instances patch INSTANCE_NAME --database-flags="cloudsql enable linked servers"=on

INSTANCE_NAME 替换为您要用于关联服务器的实例的名称。

如需了解详情,请参阅配置数据库标志

添加关联的服务器

如需添加关联的服务器,请运行 Transact-SQL sp_addlinkedserver 命令:

EXEC master.dbo.sp_addlinkedserver
    @server = N'LINKED_SERVER_NAME',
    @srvproduct=N'',
    @provider=N'SQLNCLI',
    @datasrc=N'TARGET_SERVER_ID'

请替换以下内容:

  • LINKED_SERVER_NAME 替换为要创建的关联服务器的名称。
  • TARGET_SERVER_ID 替换为关联服务器的网络名称、DNS 名称或 IP 地址。对于实例名称,请使用 servername\instancename 格式。如果您的实例使用的是非标准端口,请添加端口号。例如 servername\instancename, 8080

如需为当前登录的用户添加用户映射,请运行以下命令:

EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname=N'LINKED_SERVER_NAME',
    @useself=N'True'

LINKED_SERVER_NAME 替换为关联服务器的名称。

如需创建或更新默认远程登录用户和密码并将其应用于所有本地登录,请运行以下命令:

EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname=N'LINKED_SERVER_NAME',
    @useself=N'False',
    @locallogin=N'LOGIN',
    @rmtuser=N'USER_ID',
    @rmtpassword='PASSWORD';

请替换以下内容:

  • LINKED_SERVER_NAME 替换为关联服务器的名称。
  • LOGIN 替换为本地服务器的登录用户。locallogin 是 sysname,默认值为 NULL。NULL 意味着此条目将应用于连接到 rmtsrvname 的所有本地登录。如果不为 NULL,则 locallogin 为 SQL Server 或 Windows 的登录用户。如果您使用 Windows 登录用户,则其必须要么能够直接访问 SQL Server,要么能够通过拥有 SQL Server 访问权限的 Windows 群组成员关系进行访问。
  • USER_ID 替换为登录用户。
  • PASSWORD 替换为用户密码。

通过加密连接添加关联的服务器

如需使用加密连接添加关联的服务器,请运行 Transact-SQL sp_addlinkedserver 命令:

EXEC master.dbo.sp_addlinkedserver
    @server = N'LINKED_SERVER_NAME',
    @srvproduct=N'',
    @provider=N'SQLNCLI',
    @datasrc=N'TARGET_SERVER_ID,
    @provstr=N'Encrypt=yes;'

请替换以下内容:

  • LINKED_SERVER_NAME 替换为要创建的关联服务器的名称。
  • TARGET_SERVER_ID 替换为目标服务器的名称,或目标服务器的 IP 地址和端口号。

如果服务器的名称与证书中的名称不同,则您需要指示 SQL Server 可以信任服务器证书。如需更新提供方字符串,请运行以下命令:

EXEC master.dbo.sp_addlinkedserver
    @server = N'LINKED_SERVER_NAME',
    @srvproduct=N'',
    @provider=N'SQLNCLI',
    @datasrc=N'TARGET_SERVER_ID,
    @provstr=N'Encrypt=yes;TrustServerCertificate=yes;'

请替换以下内容:

  • LINKED_SERVER_NAME 替换为要创建的关联服务器的名称。
  • TARGET_SERVER_ID 替换为目标服务器的名称,或目标服务器的 IP 地址和端口号。

关联的服务器查询

除了以下命令之外,Cloud SQL 还支持使用四部分名称来查询关联的服务器(服务器名称、数据库名称、架构名称和对象名称):

  • OPENQUERY 在指定的服务器上执行查询。
  • EXECUTE 让您可以对关联的服务器运行动态 SQL。

如需了解详情,请参阅查询远程执行方法比较

在关联的服务器上启用远程过程调用

通过远程过程调用 (RPC),您可以在关联的服务器上运行存储过程。如需添加 RPC,请运行添加了 RPC 参数的 Transact-SQL sp_serveroption 命令。有两个 RPC 参数:

  • rpc 用于为指定的来源服务器启用 RPC。
  • rpc out 用于为指定的目标服务器启用 RPC。

使用以下添加了 rpc 参数的 sp_serveroption 命令,从 LINKED_SERVER_NAME 启用 RPC:

EXEC sp_serveroption
    @server='LINKED_SERVER_NAME',
    @optname='rpc',
    @optvalue='TRUE'

LINKED_SERVER_NAME 替换为关联服务器的名称。

使用以下添加了 rpc out 参数的 sp_serveroption 命令来启用 RPC:

EXEC sp_serveroption
    @server='LINKED_SERVER_NAME',
    @optname='rpc out',
    @optvalue='TRUE'

LINKED_SERVER_NAME 替换为关联服务器的名称。

移除关联的服务器的用户映射

如需移除之前添加的用户映射,请运行以下命令:

EXEC master.dbo.sp_droplinkedsrvlogin
    @rmtsrvname=N'LINKED_SERVER_NAME',
    @locallogin=N'LOGIN';

请替换以下内容:

  • LINKED_SERVER_NAME 替换为要删除的关联服务器的名称。
  • LOGIN 替换为本地服务器的登录用户。locallogin 是 sysname,默认值为 NULL。NULL 意味着此条目将应用于连接到 rmtsrvname 的所有本地登录。如果不为 NULL,则 locallogin 为 SQL Server 或 Windows 的登录用户。如果您使用 Windows 登录用户,则其必须要么能够直接访问 SQL Server,要么能够通过拥有 SQL Server 访问权限的 Windows 群组成员关系进行访问。

移除已注册的实例以不再允许其使用关联的服务器

如需移除关联的服务器,请执行以下操作:

  • 使用 Transact-SQL sp_dropserver 存储过程删除现有的关联服务器。
  • 移除 cloudsql enable linked servers 标志以移除已注册的实例。

    gcloud sql instances patch INSTANCE_NAME --database-flags="cloudsql enable linked servers"=off

    INSTANCE_NAME 替换为您要移除其关联服务器的实例的名称。

    或者,您也可以运行以下命令以清除所有数据库标志:

    gcloud sql instances patch INSTANCE_NAME --clear-database-flags

    INSTANCE_NAME 替换为您要移除其关联服务器的实例的名称。

问题排查

错误消息 问题排查
Msg 7411, Level 16, State 1, Line 25

Server 'LINKED_SERVER_NAME' is not configured for DATA ACCESS.
DataAccess 选项已停用。运行以下命令以启用数据访问权限:
EXEC sp_serveroption
    @server='LINKED_SERVER_NAME',
    @optname='data access',
    @optvalue='TRUE'

LINKED_SERVER_NAME 替换为关联服务器的名称。

Access to the remote server is denied because no login-mapping exists. (Microsoft SQL Server, Error: 7416) 如果您在建立加密连接时遇到该问题,则需要在访问关联的服务器时尝试以其他方式提供用户 ID。要执行此操作,请运行以下命令:
EXEC master.dbo.sp_addlinkedserver
   @server = N'LINKED_SERVER_NAME',
   @srvproduct= N'',
   @provider= N'SQLNCLI',
   @datasrc= N'TARGET_SERVER_ID',
   @provstr= N'Encrypt=yes;TrustServerCertificate=yes;User ID=USER_ID'

替换以下内容:

  • LINKED_SERVER_NAME 替换为关联服务器的名称。
  • TARGET_SERVER_ID 替换为目标服务器的名称,或目标服务器的 IP 地址和端口号。
  • USER_ID 替换为登录用户。

后续步骤