我正在使用SSDT(VS 2012)来维护和部署我们的数据库。
最近我们在主数据库项目中添加了一个链接服务器,并且它第一次部署得很好。由于数据库漂移,迎面而来的部署到同一个db-server /数据库失败,给出错误:
SQL00000:数据库已从其注册的数据层应用程序中漂移。
对象[LinkedServer]已经存在于具有不同定义的数据库中,不会被更改
注意:出现此错误时,数据库未进行任何更改。
链接服务器配置如下(删除了客户特定数据):
EXEC sp_addlinkedserver
@server=N'LinkedServer',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'SrcPath';
脚本文件的Build Action设置为 Build ,并作为模式的一部分进行部署。
我们使用的发布配置文件具有"当数据库已从注册版本" 设置中移出时阻止发布。更改此设置不是一个选项,因为我们希望在数据库漂移时停止发布。
答案 0 :(得分:1)
您是否将此添加为预部署脚本?如果是这样,考虑在它周围写一些逻辑来检查它是否存在。我无法想到为什么我要将其部署为" Build"脚本,因为它会在您每次部署时尝试完全执行上述操作。
答案 1 :(得分:0)
使用预部署脚本解决了该问题。虽然SSDT中的Linked Server模板是默认创建的,Build Action设置为Build。所以我认为应该将链接服务器作为模式的一部分。
IF NOT EXISTS(SELECT * FROM sys.servers WHERE is_linked = 1 and name = 'LinkedServer')
BEGIN
EXEC sp_addlinkedserver
@server=N'LinkedServer',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'SrcPath';
END