它正在更改我的查询,并且似乎完全可以对我的表进行限定,而无需我明确告知。有没有办法阻止它这样做?
这里是我所看到的相关信息。让我知道是否还有其他帮助。
我们有一个名为serverName
的SQL Server。它已经投入生产多年了。它已从Windows 2008 Server迁移到Windows 2012 Server。新服务器的名称为sql_1234_4321
(不是真实名称,但很糟糕)
我们有第n个应用程序正在使用旧的serverName
SQL Server,因此我们使旧服务器脱机并为serverName
创建了DNS条目,该条目指向新的sql_1234_4321
,希望我们不必点击使用旧服务器的所有应用的连接字符串。
除了某些C#ASP.NET MVC应用程序外,大多数情况下都有效。
他们正在使用System.Data.SqlClient.SqlCommand
。
连接字符串:
Data Source=serverName;Initial Catalog=USData; Persist Security Info=True; User ID=appUn;Password=appPw
SQL查询:
select FirstName from Customers
代码:
using (SqlCommand cmd = new SqlCommand(query, sqlConnection))
{
if (parameters != null)
{
cmd.Parameters.AddRange(parameters.ToArray());
}
var reader = cmd.ExecuteReader();
var results = new List<TType>();
while (reader.Read())
{
results.Add(convert(reader));
}
return results;
}
我收到一个错误:
在sys.servers中找不到服务器'serverName'。请验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver将服务器添加到sys.servers。
为什么会出现此错误?在连接字符串中唯一引用serverName
的时间。我的查询应该只在服务器上使用默认名称空间。但似乎我的查询在过程中的某个时刻已经完全合格,如下所示:
select FirstName from serverName.USData.dbo.Customers
我在新的serverName
服务器上添加了一个链接服务器sql_1234_4321
,该服务器只是指向自身,这似乎可以解决问题。但是,这绝对是肮脏的,这让我怀疑它是否真的在进行跨服务器查询,或者它是否足够聪明地说“嗨!我们在自欺欺人,所以不必担心会进入网络并进行此操作。比应有的价格昂贵”,但我对此表示怀疑。
我曾考虑过使用同义词,但问题是我们有带有服务器名称的表。并且可能会有查询命中带有服务器名称的服务器,因此以下操作将不起作用:
CREATE SYNONYM serverName FOR sql_1234_4321;
因此,我必须为服务器上的每个数据库指定一个特定的同义词:
CREATE SYNONYM serverName.database1 FOR sql_1234_4321.database1;
CREATE SYNONYM serverName.database2 FOR sql_1234_4321.database2;
CREATE SYNONYM serverName.database3 FOR sql_1234_4321.database3;
CREATE SYNONYM serverName.database4 FOR sql_1234_4321.database4;
CREATE SYNONYM serverName.database5 FOR sql_1234_4321.database5;
CREATE SYNONYM serverName.database6 FOR sql_1234_4321.database6;
CREATE SYNONYM serverName.database7 FOR sql_1234_4321.database7;
CREATE SYNONYM serverName.database8 FOR sql_1234_4321.database8;
CREATE SYNONYM serverName.database9 FOR sql_1234_4321.database9;
CREATE SYNONYM serverName.database10 FOR sql_1234_4321.database10;
如您所见,这将是一场噩梦,而且感觉很脏。
我的问题是...在什么时候基于连接字符串对表名进行完全限定?有办法防止这种情况发生吗?
大卫·布朗(David Browne)带领我找到了问题。我的查询实际上引用了一个视图,而该视图具有对旧服务器的引用。我的疏忽大意是没有注意到这一点。谢谢大卫