2015-11-06 68 views
0

我一直在使用SSDT和VS2013,到目前为止,已经发现当存储过程引用不存在的列时,构建失败。SSDT发布时出错但未生成

今天我已经成功构建了一个项目,但发现发布失败。错误是标准的“权限有一个未解决的引用对象[表]。[列]”。我知道这是由于存储过程寻找不再存在的列。

我的问题是为什么这个构建首先取得成功,因为这肯定是失败应该发生的地方。是否有一个配置选项可以在构建级别控制这种行为?

回答

2

这里有两种情况的行为不同。

场景1:引用数据库项目中定义的表中不存在的列的存储过程将产生错误并阻止构建成功。

场景2:引用未在数据库项目中定义的表的存储过程将产生警告,并且不会阻止构建成功。

情景2更有趣,因为当您尝试发布项目时,发布可能成功或失败,具体取决于目标数据库中的内容以及您如何配置部署设置。例如,假设:

  • 你的存储过程包含dbo.SomeTable.Column1
  • 参考数据库项目不包含dbo.SomeTable

定义在这种情况下,如果目标数据库不包含dbo.SomeTable,则部署将成功,因为SQL Server允许过程引用不存在的表(称为延迟名称解析功能)。

但假设目标数据库确实包含dbo.SomeTable。如果目标数据库上的dbo.SomeTable实际上有一个名为Column1的列,则部署将会成功。但是,如果目标数据库上的dbo.SomeTable没有名为Column1的列,则部署将失败。

您不清楚您遇到过哪种情况。如果它更像方案1,其中对数据库项目中定义的表有无效的引用,但由于某些原因,SSDT不会产生错误,那么这就是一个错误,并且记录连接问题会很好在https://connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx使用“开发人员工具(SSDT,BIDS等)”类别。

+0

如果您希望脚本2的构建失败,可以启用“将Transact-SQL警告视为错误”,并且构建失败(我喜欢将其作为一种良好实践启用),尽管您可以部署代码将不会运行(直到表创建) –

+0

感谢您的反馈,这是一个非常透彻的洞察力,我知道会证明是有用的。我打算今天再看一遍,但在此期间: 将Transact-SQL警告视为错误确实会导致警告为错误,但不会出现此错误。此问题实际上并未在警告下记录。但是,它在输出标签中显示为警告。 在这种情况下,发布是一个干净的发布,所以目标数据库在发布之前不存在。我相信但是会重新检查表格是否被定义。这会让我回到场景1,但正如我所说,我会重新检查这一点。 – SQuirellingAlong