0

我继承了一个旧系统,该系统在同一台服务器上有两个 SQL Server 实例。有时,某些用户操作会导致某些记录在实例之间“同步”。系统使用“链接服务器”,因此主实例上的存储过程可以查询另一个实例。该sys.servers表有以下记录:

| server_id | name        | 
=========================== 
| 0         | sql08\main  |
| 1         | sql08\other |

调用 sproc 的网站将链接服务器名称存储在配置文件中。我猜他们预计它会在某个时候改变,但它从来没有改变过。它始终与主实例位于同一主机上。

<appSettings>
  <add key="LinkedServer" value="sql08\other" />
</appSettings>

并将其传递给 sproc 以生成动态 SQL 语句。我会跳过 ADO.NET 命令/参数的东西,这很正常。sproc 执行以下操作:

DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM [' + @LinkedServer + '].db.schema.table WHERE ...'
EXEC sp_executesql @sql

我使用 web.config 转换来支持将 Debug 配置指向测试环境,并将 Release 配置指向生产环境。但是,我还需要它在任何开发人员工作站上运行,这意味着使用localhost,而不是实际的主机名。

选项 A:添加特殊链接服务器

我可以要求一个特殊的链接服务器使用localhost而不是主机名。我不喜欢它与测试/生产环境不同,并且需要自定义设置。这里有什么“陷阱”吗?我无法以一种或另一种方式找到任何指导。

EXEC sp_addlinkedserver 'localhost\other', @srvproduct = 'SQL Server'

选项 B:删除设置

或者,鉴于链接服务器始终位于同一主机上,我可以在存储过程中使用该host_name()功能,完全无需配置。如果我使用此选项,除了链接服务器移动的机会外,还有什么需要注意的吗?

DECLARE @sql VARCHAR(MAX) = 'SELECT * FROM [' + HOST_NAME() + '\other].db.schema.table WHERE ...'
EXEC sp_executesql @sql
4

1 回答 1

3

我建议SYNONYM在您的服务器和生产中使用 a 。这样,您可以拥有不同的链接服务器,而系统的其余部分则不知道。

开发中:

CREATE SYNONYM dbo.linkedtable FOR [LOCALHOST\other].db.schema.table;

生产中:

CREATE SYNONYM dbo.linkedtable FOR [SQL08\other].db.schema.table;

如果您有大量此类服务器,请在这两个位置创建一个具有相同名称的附加链接服务器。

如果您有一个在您设置的每台服务器上运行的脚本,那么您可以动态生成同义词,例如:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'CREATE SYNONYM dbo.linkedtable FOR ['
  + HOST_NAME() + '\other].db.schema.table;';

EXEC sp_executesql @sql;
于 2013-07-29T21:13:10.987 回答