【问题标题】:How to extract MSSQLServer database as .dacpac without VerifyExtraction?如何在没有验证提取的情况下将 MSSQLServer 数据库提取为 .dacpac?
【发布时间】:2015-01-01 17:20:19
【问题描述】:

我想使用 Server Management Studio 提取 MSSQLServer 数据库的数据库架构。我使用提取命令“提取数据层应用程序..”

在数据库中有几个对另一个数据库的引用。因此,我收到以下错误。

提取数据库时出错:验证数据包的模式模型失败。 错误 SQL71562:验证元素 [dbo].[x] 时出错,对对象 [dbo].[y] 的引用未解析。从该平台创建包时不支持外部引用。

问题在于,SSMS 使用带有参数 /p:VerifyExtraction=True 的 SQLPackage.exe。当我使用控制台并在没有此参数的情况下调用 SQLPackage.exe 时,它​​默认使用 /p:VerifyExtraction=False,我可以创建 .dacpac 文件。

有没有办法配置 SSMS 来禁用验证?

【问题讨论】:

    标签: sql-server database ssms data-tier-applications


    【解决方案1】:

    我也找不到在 SSMS(2008 R2 或 2012)中有效的方法,但带有 SSDT 的 Visual Studio (2013) 似乎有效:在 VS 中,转到 SQL Server 对象资源管理器,连接到有问题的服务器,右键单击有问题的数据库,提取数据层应用程序,然后调整提取设置,其中之一是“验证提取”。我不知道为什么 MS 不只是将其构建到 SSMS 中。

    我注意到这样做的一件有点奇怪的事情是,VS 只会通过这种方法提取 .DacPac。即使您选择将数据添加到数据提取,扩展名仍然是 .DacPac。我的印象是 .DacPac 仅用于 Schema Only,而 .BacPac 用于 Schema + Data。无论如何,在 VS 创建 .DacPac (Schema + Data) 文件后,SSMS 能够使用“部署数据层应用程序...”向导将其正常导入。

    【讨论】:

      【解决方案2】:

      如果您无法使用 Visual Studio,您可以使用命令行SqlPackage 应用程序从数据库中提取架构。默认情况下,这验证架构(不,我不知道为什么 SSMS 和命令行提供的默认值不同!)。 SqlPackage.exe 可以在C:\Program Files (x86)\Microsoft SQL Server\<SQL_VERSION>\DAC\bin 中找到。

      例如,以下从本地 SQL Server 实例中提取 MyDatabase 的架构并将其输出到本地文件系统上的 .dacpac 文件:

      sqlpackage /Action:Extract /SourceDatabaseName:"MyDatabase" /SourceServerName:localhost /TargetFile:"C:\SomeDirectory\MyDatabase.dacpac"
      

      如果您想在稍后阶段包含架构验证,您可以通过在命令行中添加 /p:VerifyExtraction=True 来显式设置标志。

      关于SqlPackage.exe的完整信息可以在这里找到:

      https://msdn.microsoft.com/library/hh550080.aspx

      【讨论】:

      • 在使用不起作用的 Powershell 脚本、不一致的程序集和版本(我承认缺乏使用 Powershell 的经验)追了我几个小时之后,这立即奏效了。
      • @Nick.McDermaid 感谢您的评论,我很高兴听到它有帮助。
      • 显示 SSMS 17.5 的位置是 C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin\SqlPackage.exe
      • @yvesva 谢谢!是的,不同版本的 SQL Server 及其工具存储在单独的编号目录下,140 对应于 SQL Server 2017。我现在没有在我的答案中硬编码其中之一,而是改为使用 <SQL_VERSION>
      • @CB_Ron 根据 sqlpackage 发行说明,去年添加了对 MI 的支持:docs.microsoft.com/en-gb/sql/tools/… PowerShell 和命令行的行为应该相同。
      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2021-12-05
      • 2021-08-15
      • 2019-09-26
      相关资源
      最近更新 更多