【发布时间】:2015-07-10 06:25:41
【问题描述】:
我有一个带有 2 个 SQL 项目 DB1、DB2 的 Visual Studio 2013 解决方案。
DB1 有一个引用 DB2 的存储过程。
如果我在程序中使用 .dacpac 和同义词
SELECT * FROM [$(DB2)].[dbo].[Table1]
然后Compare Schema from Database to the SQL Project错误地将上述内容检测为更改,因为它不处理变量/同义词。
如果我改为使用
SELECT * FROM DB2.[dbo].[Table1]
并将存储过程构建类型更改为 None(以便项目构建)然后架构比较 当从数据库 到 Proejct** 将“看不到”将 proc 存储在我的项目中,并在每次比较时向 SQL 数据库项目添加一个新的 proc
架构比较后,我现在会看到
- DB1
- dbo
- 存储过程
- sp_myStoredProcedure.sql
- sp_myStoredProcedure1.sql
- sp_myStoredProceduren.sql
- 存储过程
- dbo
其中 n = 比较模式的数量!
如果有办法忽略 Build Error SQL7501,那么它应该可以使用第二个选项,但它似乎不能被忽略。
另一个解决方案是保存模式比较并在所有引用 DB2 的过程上手动选择跳过,但是我想检测这些过程中的变化。
这似乎是一个简单而常见的用例。有人想出解决这个设计缺陷的方法吗?
更新
在测试了凯文的回答后,我已经确定了为什么我的某些观点没有被 SC 正确处理。然而,他的回答在技术上是正确的:
如果您在 DB1 中有视图:
SELECT * FROM DB1.dbo.Table1 T1
INNER JOIN DB2.dbo.Table2 T2
ON T2.Field1 = T1.Field1
并且在您的 DB1 SQL 项目中是原始的(没有自引用 DB1)
SELECT * FROM dbo.Table1 T1
INNER JOIN [$(DB2)].dbo.Table2 T2
ON T2.Field1 = T1.Field1
架构比较将无法正确替换变量并识别更改:[$(DB2)] -> $(DB2)
问题是自引用 DB1.dbo.Table 在我的例子中,它被插入到大量连接的中途,其中许多连接是 DB2 引用。
这会导致 SC 错误地将所有 [$(DB2)] 标记为更改。可能是因为数据库 sql 没有在 VS 中“构建”并恢复为文本比较。
所以这并不是一个真正的错误,但对于不手动比较 SQL 的每一行的开发人员来说,这是一个令人困惑的结果。
我认为这个问题可以扩展为:
任何时候数据库 SQL 不构建 SQL CMD 变量都不会 解析并会导致可能掩盖原始构建的错误 失败。
我还必须补充一点,在我的例子中,DB2 也引用了 DB1!
这可能是未能正确报告错误的部分原因。
最后,为了避免循环依赖(项目不能相互引用),我使用项目引用构建了引用 DB2 的 DB1,但检查了“抑制引用项目中的构建错误”。 DB2 没有构建,因为它引用了 DB1。
DB1 构建后,我使用 bin 文件夹中的输出 DACPAC,将其复制到另一个位置,并在 DB2 中引用该 DB1 DACPAC。现在,每当 DB1 发生更改时,我都必须重建 DACPAC 复制到此文件夹。幸运的是,这不会改变太多。
整个过程非常复杂,SQL 项目应该允许相互引用(通过远程错误抑制),但不管最终我设法获得了 2 个要构建的相互引用的 db,并且所有同义词和架构比较兼容!
而且只用了2天的奋斗时间!
https://connect.microsoft.com/VisualStudio/feedback/details/1291555
【问题讨论】:
标签: sql visual-studio-2013 schema database-project schema-compare