SQL Server 2017 master.dacpac 在 SSDT 2015 中缺少系统 DMV

System DMV's missing from SQL Server 2017 master.dacpac in SSDT 2015

我将 Ola Hallengren 出色的维护解决方案脚本整合到了一个 DBA 工具数据库项目中。这是使用 SSDT 2015 维护的,目标平台为 SQL Server 2012。该项目包括对内置系统数据库 master 和 msdb 的引用。项目构建成功。

Ola 最近 updated 他的脚本,它们现在包含对新 SQL Server 2017 DMV 的引用,因此将更新的脚本合并到我的数据库项目中会为新的 DMV 生成未解决的引用错误。

SQL71502: Procedure: [dbo].[DatabaseBackup] has an unresolved reference to object [sys].[dm_os_host_info]
SQL71502: Procedure: [dbo].[DatabaseBackup] has an unresolved reference to object [sys].[dm_db_log_stats]

虽然我没有在任何地方安装 SQL Server 2017,但我尝试将目标平台更新为 SQL Server 2017,然后删除并重新创建主数据库引用(即更新 [= =38=] 到 SQL Server 2017 版本),但这并没有消除构建错误。

引用的 dacpac 的文件路径是:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SqlSchemas\master.dacpac

当我检查 dacpac 时,新的 DMV 的 [sys].[dm_os_host_info] 和 [sys].[dm_db_log_stats] 不在那里。

我昨天联系了 Slack,Peter Schott 向我推荐了一篇关于如何更新 master.dacpac (link) 的优秀博客 post。理论是抓住丢失的 DMV 并将它们添加到 master.dacpac 我自己。我必须启动一台测试机并安装 SQL Server 2017 才能执行此操作,但作为一种解决方法,这是可行的。

然而,这感觉像是我不应该做的事情。毕竟,这些是系统DMV的缺失master.dacpac,而不是将我自己的代码添加到master数据库中。

所以,我想我的问题是:

  1. 这是我本地 SSDT 安装的问题,还是 SSDT 安装的 dacpac 缺少系统 DMV 的一般问题?
  2. 如何在不自己破解的情况下获得更新(并签名)master.dacpac?

虽然我没有解决原始问题(master.dacpac 中缺少系统 DMV),但我确实对我最初提出的两个问题有了答案。

是的,这是 SSDT 附带的 master.dacpac 的普遍问题。不,似乎没有任何方法可以在不使用之前详述的解决方法自行破解的情况下获得更新 master.dacpac。

我现在在 UserVoice 上提出了一个项目,请求一种在 SSDT 中更新系统数据库 DACPAC 的方法。 如果有机会,请考虑投票。谢谢

我为此所做的是

  1. 添加一个额外的 SSDT 项目(例如“master_expanded”)
  2. 为缺失的引用编写一些虚拟项目(例如,虚拟 table 包含以下列:select * from sys.dm_exec_describe_first_result_set('select * from [sys].[dm_os_host_info]', default, default);
  3. 添加master_expanded作为原始项目的数据库引用(“相同的数据库,相同的服务器”)——现在原始项目可以找到sys.dm_os_host_info

请注意,虚拟架构对象必须从实际部署中排除。我们使用模式比较文件 (scmp),因此我们只排除了这些对象。