我正在使用 VS Pro 2019。我创建了一个 SQL Server DB 项目。我创建了几个脚本(所有这些都是 CREATE OR ALTER PROCEDURE)。
在这一点上,我正在寻找一个神奇的按钮来运行它们(并在黑暗中绑定它们......对不起;)。
什么也没找到。我试图发布该项目,因为这是我的理解。发布操作工作正常,但我所看到的脚本都没有运行。
我错过了什么?我试图在项目的根目录创建一个脚本,以防它不支持多目录但它没有帮助。
我正在使用 VS Pro 2019。我创建了一个 SQL Server DB 项目。我创建了几个脚本(所有这些都是 CREATE OR ALTER PROCEDURE)。
在这一点上,我正在寻找一个神奇的按钮来运行它们(并在黑暗中绑定它们......对不起;)。
什么也没找到。我试图发布该项目,因为这是我的理解。发布操作工作正常,但我所看到的脚本都没有运行。
我错过了什么?我试图在项目的根目录创建一个脚本,以防它不支持多目录但它没有帮助。
SSDT 是一种基于状态的方法。
对于每个版本,数据库中每个对象的定义都存储在源代码管理中。在部署时,将目标数据库与源代码控制中的状态(通过 DacPac)进行比较,并生成部署脚本以将目标数据库更新到该特定版本。
代码必须以模式和内部对象的方式组织,如下图所示:
图片来源:https ://devblogs.microsoft.com/wp-content/uploads/sites/31/2019/04/ssdt10_thumb.png
全部设置好后,发布项目,并将项目和数据库之间的差异应用到目标数据库上。
SSDT 能够使用 Pre 或 PostDeployment 机制运行“定制”脚本。但是对于无法以标准方式解决的情况,我会将其用作最后的手段。
部署前和部署后脚本在从数据库项目生成的主部署脚本之前和之后执行 Transact-SQL 语句。从 Visual Studio 中的架构比较结果更新目标时,不会执行预部署脚本。一个项目只能有一个部署前脚本和一个部署后脚本。这些脚本可用于多种用途
我们可以在问题中看到的代码结构看起来像是一种不同的基于迁移的方法(例如 Redgate Flyway/ReadyRoll 支持)。在这种方法中,每个更改都准备了一个单独的 SQL 脚本,并且脚本必须以特定的顺序运行。
ReadyRoll Core 是一种基于迁移的方法。ReadyRoll Core 会在开发时为每个更改生成一个迁移脚本,可以对其进行编辑,以便开发人员可以完全控制在部署时会发生什么。迁移脚本存储在源代码管理中。在部署时,将迁移脚本拼接在一起以生成部署脚本。每个迁移脚本仅针对目标环境运行一次
关键区别在于脚本的有效负载是什么:
+--------+-------------------+-----------------+
| | state-based | migration-based |
+--------+-------------------+-----------------+
| script | object definition | change |
+--------+-------------------+-----------------+
使用 PostDeployment,您可以使用 sqlcmd “强制” SSDT 表现得像基于迁移的工具:r
。
:r <filename> 将额外的 Transact-SQL 语句和 sqlcmd 命令从 指定的文件解析到语句缓存中。
PostDeployment 脚本内容:
:r\...\Script1.sql
:r\...\Script2.sql
:r\...\...
:r\...\Scriptn.sql
但是这样做你会失去基于状态的迁移的所有好处,比如对象验证、检查它们之间的引用等等。另一个挑战是脚本必须是幂等的,或者使用某种历史表来标记哪些脚本已经被应用。
幂等性是数学和计算机科学中某些运算的属性,可以多次应用而不改变第一次运行后的结果。当您对数据库进行更改以部署新版本时,您需要确保某些更改没有进行两次或以错误的顺序进行。如果你忽略了这一点,你通常会得到一个错误,但后果并不是完全可以预测的,而且一连串的事件可能会有一个不愉快的结局。