Asp.net 我应该使用localhost链接服务器或HOST_NAME()函数来避免硬编码此SQL server主机名吗?

Asp.net 我应该使用localhost链接服务器或HOST_NAME()函数来避免硬编码此SQL server主机名吗?,asp.net,sql-server,linked-server,Asp.net,Sql Server,Linked Server,我继承了一个在同一台服务器上有两个SQL Server实例的遗留系统。有时,一些用户操作会导致一些记录在实例之间“同步”。系统使用“链接服务器”,因此主实例上的存储过程可以查询其他实例。sys.servers表包含以下记录: | server_id | name | =========================== | 0 | sql08\main | | 1 | sql08\other | 调用存储过程的网站将链接的服务器名称存储在配

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

| server_id | name        | 
=========================== 
| 0         | sql08\main  |
| 1         | sql08\other |
调用存储过程的网站将链接的服务器名称存储在配置文件中。我猜他们希望它在某个时候会改变,但从来没有改变过。它始终与主实例位于同一主机上

<appSettings>
  <add key="LinkedServer" value="sql08\other" />
</appSettings>
我使用web.config转换来支持将调试配置指向测试环境,将发布配置指向生产环境但是,我还需要它在任何开发人员工作站上运行,这意味着使用
localhost
,而不是实际的主机名。

选项A:添加特殊链接服务器 我可以要求使用
localhost
而不是主机名的特殊链接服务器。我不喜欢它与测试/生产环境不同,需要自定义设置这里有什么“陷阱”吗?我找不到任何指导

EXEC sp_addlinkedserver 'localhost\other', @srvproduct = 'SQL Server'
选项B:删除设置 或者,考虑到链接的服务器总是在同一台主机上,我可以在存储过程中使用
host\u name()
函数,完全不需要配置如果我使用此选项,除了链接服务器移动的可能性之外,还有什么需要注意的吗

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

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

发展中:

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;

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

发展中:

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;

这是一个有趣的想法,我不知道同义词。但是,考虑到SQL语句,每个环境/系统仍然需要一个SQL语句。我是否可以将
HOST\u NAME()
混合到该语句中,以生成一个可重用的同义词创建脚本?我不知道每个系统定义一个同义词的障碍是什么。这比为每个系统定义一个同义词更难吗?这个系统吸收了
HOST\u NAME()
(顺便说一句,这是不可能的)?我不关心为每个系统创建同义词,我关心的是如何做到这一点。我不会为每个系统手动运行自定义脚本。我想为任何系统向源代码管理提交一个安装脚本。这有意义吗?好的,
每个环境/系统一个
在所有环境/系统上以一致方式创建的同义词完全不同。无论如何,我已经用一个建议更新了我的答案。这是一个有趣的想法,我不知道同义词。但是,考虑到SQL语句,每个环境/系统仍然需要一个SQL语句。我是否可以将
HOST\u NAME()
混合到该语句中,以生成一个可重用的同义词创建脚本?我不知道每个系统定义一个同义词的障碍是什么。这比为每个系统定义一个同义词更难吗?这个系统吸收了
HOST\u NAME()
(顺便说一句,这是不可能的)?我不关心为每个系统创建同义词,我关心的是如何做到这一点。我不会为每个系统手动运行自定义脚本。我想为任何系统向源代码管理提交一个安装脚本。这有意义吗?好的,
每个环境/系统一个
在所有环境/系统上以一致方式创建的同义词完全不同。无论如何,我已经用一个建议更新了我的答案。