我继承了一个旧系统,该系统在同一台服务器上有两个 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