Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 由于非集群索引的依赖性,alter table drop列在SSDT中失败_Sql_Sql Server_Deployment_Sql Server Data Tools - Fatal编程技术网

Sql 由于非集群索引的依赖性,alter table drop列在SSDT中失败

Sql 由于非集群索引的依赖性,alter table drop列在SSDT中失败,sql,sql-server,deployment,sql-server-data-tools,Sql,Sql Server,Deployment,Sql Server Data Tools,我已经为SQL Server 2012数据库创建了一个SSDT项目。因为SQL Server数据库引擎中已经存在数据库,所以我使用导入功能将所有对象导入到SSDT中。一切正常,但我现在面临两个问题 1) 因为其中一个表使用HIERARCHYID列(col1)作为数据类型,并且有一个基于HIERARCHYID列的计算列。computed列的定义类似于case Col1=hierarchy.GETRoot()表达式结尾的NULL。在SSDT中导入表脚本后,将出现未解决引用的错误。 如果我将定义更改为

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

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

2) 如果我保留上述解决方案(即保留col1 after=),那么在发布项目时,SSDT必须在生产服务器上删除该列,然后重新创建它。因为有一个索引依赖于此列,所以部署get每次都失败,因为其他对象访问了它,所以说altertable DROP column之类的错误失败了。我无法控制SSDT如何设计/发布脚本。如果我必须在发布数据库项目之前删除所有依赖对象,那么我认为这是没有用的

请建议我如何解决这个问题

谢谢
Atul

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

我能够重现您描述的参考解决问题。我建议通过以下链接将该问题提交给Microsoft:

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

如果您有最新的版本,您能提供一个示例模式来说明这个问题吗?

我已经有好几天遇到同一个问题了。在找到您的帖子以确认该问题在SSDT中之后,我意识到它可能会在比我们当前使用的版本更新的版本中得到修复:12.0.50730.0(VS 2013,本项目使用的版本)

我还从VS2017安装了14.0.3917.1版。我只是尝试了一下,没有问题因此解决方案是升级您的SSDT版本

请忽略这个解决方案,我昨晚的成功似乎是反常的。今天在还原有此问题的数据库后尝试重复此操作时,部署再次无法说明至少一个索引

编辑: 我已经在用户语音上发布了关于此的信息:

此外,为了确保这至少是一个可行的答案,我正在实现的解决方案包括使用部署前和部署后脚本删除并重新创建丢失的索引


如果dacpac旨在更新数据库的各种版本,这些版本可能与模型有不同程度的偏差,那么这不是一个理想的解决方案,但是它对我们来说是可行的,因为我们对所有实例都有严格的控制,并且可以预期每个db实例的每个版本生成的增量都大致相同。

谢谢。只有在使用任何CLR数据类型时,此问题才存在。我也尝试过对int数据类型列执行同样的操作,并且效果很好。我使用的SSDT版本是11.1.40403.0您能提供一个示例模式吗?例如,为了重现引用解析,我有一个初始状态脚本:创建表[dbo]。[TABLE_1]([HID][sys]。[hierarchyid]不为NULL,[IsRoot]为(当[HID]=[hierarchyid]::GetRoot()然后1 else 0 end时的情况);并修改了状态脚本:创建表[dbo]。[TABLE_1]([HID][sys]。[hierarchyid]不为NULL,[IsRoot]为(当[hierarchyid]::GetRoot()=[HID]然后1 else 0 end时的情况);我遇到的正是这个问题。。我有一个持久化的计算列,上面有一个索引。当dacpac部署尝试删除并重新创建索引时,将忽略该索引,随后部署失败。我预计现在必须删除并重新创建部署前和部署后的索引脚本,但是最好是一个有效的解决方案,而不是解决方法。在这个问题上运气好吗?确认这是我们正在使用的SSDT版本的问题;请看下面我的答案。我的答案最终是非答案。我对它进行了编辑,说了同样多的话,并在用户语音上发布了这个bug,因为它仍然存在于SSDT的当前版本中。正如我在回答中提到的,目前的解决方法是针对每个场景的部署前和部署后脚本。