【问题标题】:solution to unresolved references to objects in SSDT database projectSSDT 数据库项目中对象未解析引用的解决方案
【发布时间】:2020-02-13 13:03:48
【问题描述】:

我想建立一个 sql server 数据库的 dacpac。我使用 ssdt 将数据库对象导入到项目中。构建成功,没有任何错误,但有很多与未解决的引用相关的警告(超过 100 个)。

未解决的参考点是由于以下原因:

  • 来自同一服务器中其他数据库的对象。(警告 SQL71562)

-来自其他 sql server 实例的其他数据库的对象(警告 SQL71562)

-对象引用同一数据库本身,其中使用了 3 部分命名约定 [DatabaseName].[SchemaName].[ObjectName](警告 SQL71562)

- 包含对对象的未解析引用。对象不存在或引用不明确,因为它可能引用以下任何对象。 (警告 SQL71562)

-对象定义 [xxx].[#xyz] 与对象定义 [xxx].[#xyz] 仅大小写不同(SQL 警告:SQL71558)

-警告 SQL71562:计算列:[#abc].[def] 包含对对象的未解析引用。对象不存在或引用不明确,因为它可能引用以下任何对象:

我已经尝试部署只有警告但部署没有成功的构建。

我是 SSDT 的新手,非常感谢任何帮助。

提前致谢。 :)

【问题讨论】:

标签: sql-server-data-tools database-project


【解决方案1】:

这里有几个问题需要解决,最简单的是大小写和 3 部分名称。

对于 3 部分名称,在所有 *.sql 文件中执行查找/替换以替换 [databasename].[dbo]。与 [dbo]。括号内/非括号内的项目的各种组合就足够了。

对于大小写差异,如果不是很多,请修复它们。否则,您可以为该特定警告编号设置全局忽略。

外部数据库引用将变得更加棘手 - 这需要外部数据库引用(使用 dacpac)或指向另一个可编译项目的指针。我发现 dacpac 刚开始更容易,但这是你必须玩的东西。我在我的博客@https://schottsql.com/all-ssdt-articles 上有一些关于 SSDT 的东西,可能对那里有帮助。 (注意 - 文章很旧,但概念没有太大变化)

对于其余部分,您可能需要逐个处理这些问题。有些可能是因为它们所依赖的对象使用了“相同的数据库,三部分名称”约定,并且在更改时将得到解决。有些可能是由于外部参考。这些将需要一些工作来解决。如果项目构建成功,您可以尝试生成脚本或发布/比较。

【讨论】:

  • 感谢您的解决方案,我会尝试并更新结果。 :)
  • 我确实设法将项目发布到示例数据库以进行测试。如果我错了,请纠正我 - 如果构建成功(但警告未解析来自其他服务器或 dbs 的各种对象的引用),如果我们知道引用的对象存在,我们仍然可以部署构建而不添加对 sql 数据库项目的引用在目标上。
  • 也许吧。它实际上取决于引用的对象。我已经成功构建,因为引用存在,但如果实际对象不存在,您可能会在发布时遇到问题。例如,如果您尝试发布一组新 DB,如果 DB_A 尝试引用不存在的 DB_B 中的对象,则可能会失败。您可以设置在这些情况下不失败/回滚的选项,但是您必须多次部署,直到它们都“工作”。有时,在这些情况下,从空/已构建的 DB 的基线开始会更容易。
  • 我还面临另一个问题。我有一个在部署期间失败的存储过程,因为 sp 包含链接服务器引用,并且它当前无法连接到服务器,因为它已关闭。它是一个业务需求,提到的链接服务器仅在需要时才打开。是否有一个选项部署 sp 而无需 ssdt 检查对象引用(在本例中为链接服务器)是否已关闭?
  • 可能通过部署后脚本进行部署以获得最佳选择。即使出现错误,您可能也可以强制它继续运行,但不确定会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2012-11-02
  • 2014-11-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多