由于非聚集索引的依赖性,alter table drop column在SSDT中失败

时间:2014-06-21 06:45:19

标签: sql sql-server deployment sql-server-data-tools

我为SQL Server 2012数据库创建了一个SSDT项目。因为我已经在SQL Server数据库引擎中存在数据库所以我使用导入功能将所有对象导入到SSDT中。一切正常,但我现在面临两个问题

1)因为其中一个表使用HIERARCHYID列(col1)作为数据类型,并且有一个基于HIERARCHYID列的计算列。计算列的定义类似于案例Col1 = hierarchy.GETRoot()THE NULL ELSE someexpression END。在SSDT中导入表脚本后,未解决的引用错误开始出现。 如果我将定义更改为case hierarchy.GETRoot()= Col1 THE NULL ELSE someexpression END(注意现在col1现在结束)它工作正常。

2)如果我保留上述解决方案(即在=之后保留col1),那么在发布项目时,SSDT必须将列放在生产服务器上,然后重新创建它。因为有一个依赖于此列的索引,所以每次都会因为其他对象访问它而导致ALTER TABLE DROP COLUMN之类的错误失败,部署失败。我无法控制SSDT如何设计/发布脚本。如果我必须在发布数据库项目之前不遗余力地删除每个依赖对象,那么我认为没有使用它

请建议我如何解决此问题

由于 阿图尔

3 个答案:

答案 0 :(得分:1)

我能够重现您描述的参考分辨率问题。我建议通过Connect在此处向Microsoft提交该问题:https://connect.microsoft.com/SQLServer/feedback/CreateFeedback.aspx

我无法重现发布失败。 Visual Studio帮助的哪个版本的SSDT>关于对话节目安装?最新版本以40403.0结尾。如果您没有使用最新版本,我建议您安装它以查看是否可以修复发布失败。您可以使用工具>用于下载SSDT更新的扩展和更新。

如果您拥有最新版本,是否可以提供演示此问题的示例模式?

答案 1 :(得分:0)

将您的项目与生产dacpac进行比较,并让它生成脚本以进行更改。然后,如果需要,您可以在脚本应用于生产之前编辑它们。这就是我的开发团队的工作方式。

答案 2 :(得分:0)

我现在遇到了同样的问题好几天了。在找到你的帖子以确认问题是在SSDT中之后,我意识到它可能会在我们当前使用的版本中修复:12.0.50730.0(VS 2013,此项目使用的版本)。 < / p>

我也从VS 2017安装了版本14.0.3917.1。我只是尝试了这个,没有问题。 因此,解决方案是升级您的SSDT版本

请忽略这个解决方案,看来我昨晚的成功是异常的。在使用此问题还原数据库后尝试重复此操作时,部署无法再次考虑至少一个索引。

编辑: 我在用户语音上发布了这个帖子:https://feedback.azure.com/forums/908035-sql-server/suggestions/33850309-computed-column-indexes-are-ignored-with-dacpac-de

此外,为了保持这至少是一种可行的答案,我正在实施的解决方法涉及使用部署前和部署脚本自行删除和重新创建遗漏的索引。

如果dacpac旨在更新可能具有与模型不同级别的数据库的各种版本的数据库,那么这不是一个理想的解决方案,但是它对我们有用,因为我们可以严格控制所有实例并且可以预期大致相同delta为每个数据库实例生成每个版本。