【问题标题】:What happens when we publish the database project through visual studio当我们通过 Visual Studio 发布数据库项目时会发生什么
【发布时间】:2023-03-30 16:06:01
【问题描述】:

我一直在从事一个项目,其中包含一个数据库项目,并且我曾经在对脚本进行一些更改时发布该数据库。现在我注意到,当我发布数据库项目时,它首先构建并创建一个 dacpac 文件,然后在我选择目标数据库后发布。我有兴趣知道 dacpac 文件在发布 sql 数据库中扮演什么角色。 当我试图阅读有关 dacpac 的 pro 和 con 时,我也发现了这个东西。真的是这样吗?

Link

DACPAC 的最大问题与发布数据层应用程序以将版本更改从 DAC 推送到 SQL Server 的方式有关。这是通过使用临时名称创建一个新数据库,在数据库中生成新对象,然后将所有数据从现有数据库移动到新数据库来完成的。在传输完所有数据并运行发布后脚本后,将删除现有数据库并为新数据库赋予正确的名称。

【问题讨论】:

    标签: database visual-studio-2013 sql-server-data-tools


    【解决方案1】:

    dacpac 文件是数据库项目的编译构建输出。它类似于从 C# 类库项目构建的 .dll 文件。您在数据库项目中定义的有关数据库的所有信息都存储在 dacpac 文件中,以及有关对象之间关系的信息。

    当发布 dacpac 文件时,目标数据库与 dacpac 进行比较,该工具将确定执行什么 T-SQL 以使目标数据库与 dacpac 的定义匹配。

    关于这篇文章,请注意 SQL Server 2008 R2 附带的数据层应用程序框架在很大程度上已针对 SQL Server 2012 进行了重写/替换,因此该文章虽然对那个非常旧版本的数据层应用程序框架是正确的, 就目前可用的工具而言是不正确的。

    【讨论】:

      【解决方案2】:

      DACPAC 文件是一个 Zip 文件,其中包含您的数据库架构的 XML 表示。它不包含任何表数据(除非您提供部署前后的脚本)。更多信息请点击此处:https://www.simple-talk.com/sql/database-delivery/microsoft-and-database-lifecycle-management-(dlm)-the-dacpac/

      部署 DACPAC 时,接收服务器会比较当前架构之间的差异,然后通过生成更改脚本相应地更新您的架构。但是,请小心,因为某些更改可能非常昂贵(例如在已经有数百万行的表中间添加一个新列)。

      我链接到的文章向您展示了如何查看生成的更改脚本并了解会发生什么。在这里重复的是一个可以做到的sn-p:

      "%ProgramFiles(x86)%\Microsoft SQL Server"\110\DAC\bin\sqlpackage.exe 
          /Action:Script
          /SourceFile:MyPathAndFileToTheDacPac
          /TargetConnectionString:"Server=MyTargetInstance;Database=MyTargetDatabase;Integrated Security=SSPI;"
          /OutPutPath:"MyPathAndFile.sql"
      

      使用 DACPAC 和数据库项目(在 SSDT 中,但不使用 SQL Server Management Studio)是现在推送数据库更改的首选方式,因为它比使用手动重新设计表更不容易出错表设计器(如果您执行向现有表添加非终端列等操作,它将删除重新创建并重新填充表)。

      【讨论】:

      • 感谢链接,我认为它涵盖了大部分内容。你能检查我更新的问题,看看你能不能帮忙?
      • @Vivekh 使用 DACPAC 不会导致临时数据库存在。你在哪里看到的?
      • 我在更新问题中提供的链接中读到了这一点。我不确定它是否有效,所以想确认一下
      • 100% 部署不会创建新数据库并复制数据。也许他设置了 CreateNewDatabase 选项,无论哪种方式,我都会忽略 2012 年关于 dacpacs 的任何文章,因为过去几年有很多发展:)。 dacpac 包含创建脚本的 TSqlModel。该模型与通常使用 sqlpackage.exe 的目标(可能是数据库,另一个 dacpac)进行比较,但有一个 api 可以做到这一点(DacFx),从 Visual Studio 发布只是在后台为您完成。
      • @EdElliott 你说 VS 使用 DacFx。 DacFx 在下面使用 sqlpackage.exe 吗?
      【解决方案3】:

      我不太熟悉它,但我自己玩过一些数据库上传。从我收集的内容来看,dacpac 具有可以使用和上传的设置。我找到了这些说明: • 要创建基于 dacpac 的数据库项目,请在 Visual Studio 中创建一个新的 SQL Server 数据库项目。然后在解决方案资源管理器中右键单击项目并选择“导入 -> 数据层应用程序 (*.dacpac)”并选择您的 dacpac。这会将 dacpac 的内容转换为项目中的脚本,如果您选择“导入数据库设置”,数据库选项将根据 dacpac 中的设置进行设置。

      Dacpac 是一个数据层应用程序 (DAC) 是一个逻辑数据库管理实体,它定义了与用户数据库相关联的所有 SQL Server 对象(如表、视图和实例对象,包括登录名)。 DAC 是 SQL Server 数据库部署的自包含单元,它使数据层开发人员和数据库管理员能够将 SQL Server 对象打包到称为 DAC 包(也称为 DACPAC)的可移植工件中。来自https://msdn.microsoft.com/en-us/library/ee210546.aspx

      希望这会有所帮助...

      【讨论】:

        猜你喜欢
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多