部署 SQL SSDT 项目时如何跟踪数据更改
Posted
技术标签:
【中文标题】部署 SQL SSDT 项目时如何跟踪数据更改【英文标题】:How to track data changes when deploying a SQL SSDT project 【发布时间】:2017-12-01 22:35:02 【问题描述】:我们使用 SSDT DACPAC 部署升级数据库。开发人员在 VisualStudio 2015 中处理项目,并根据需要修改架构。
开发人员还会向项目中添加 Pre 和 Post 部署脚本。其中一些脚本可确保某些表中始终包含预期的数据。其他人在平台升级过程中添加、移动或变异数据。
我们需要改进在数据库部署期间生成的输出,以便在部署之后,我们有一个人类可读的列表,其中包含作为部署的一部分而更改的任何 data
。
我目前正在考虑两种方法。但两者似乎都不理想。它们是:
1) 手动将日志记录添加到项目中的所有 Pre 和 Post 脚本。这当然是一种选择。但它并不理想,因为它使升级脚本复杂化,并且有时开发人员可能会遗漏或错误地完成。由于目标是检测作为部署的一部分发生的意外数据更改,因此这种不确定性确实令人沮丧。最好使用通用解决方案。
2) 这是我对通用解决方案的最佳尝试:作为部署过程的一部分,为数据库中的所有用户表启用 SQL 更改数据捕获。然后,在部署结束时,收集所有捕获的更改并禁用 CDC。我实际上有这个工作。但是对数据库中的所有表启用 CDC 的过程需要几分钟(我们的一个数据库有 775 个表,在所有表上启用 CDC 大约需要 3 分钟)。这种方法也只是感觉很……沉重?
我的问题是。鉴于部署运行任意 Pre 和 Post 部署脚本,是否有更好的方法来实现可靠地生成作为数据库部署的一部分更改的数据报告的目标?
如果似乎没有更好的方法,我将不胜感激关于选项 #2 的反馈。考虑到这一点我疯了吗?
【问题讨论】:
我也在从事 SSDT Datawarehouse 项目,我们使用 SVN 来跟踪更改并跟踪当前代码,您是否考虑将整个项目放到 svn 存储库中? 嗨,@cybernetic87 感谢您的关注。是的,我们将项目保存在 SVN 中。我在这里感兴趣的是报告在部署时由项目中的 pre 和 post 脚本更改的 data。 您能否与开发人员一起将 PRINT 语句添加到 pre/post 脚本中以解释他们在做什么?也许创建一个模板供他们使用/复制,其中包括每个脚本的开始/停止时间以及关于脚本正在做什么的一些快速说明? 【参考方案1】:其中一些脚本可确保某些表中始终包含预期的数据
首先,PreDeploy/PostDeploy 脚本未经过验证。我更喜欢仅将它们用作启动点,并在存储过程中执行实际工作。
所以不要写:
INSERT INTO dbo.tab1(id, col1, col2) VALUES (...,..., ...);
并将其插入 PostDeployscript,您可以输入:
EXEC dbo.Populate_Tab1;
并将存储过程定义为:
CREATE PROCEDURE dbo.Populate_Tab1
AS
BEGIN
-- idempotent script, here by using MERGE
WITH src(id, col1, col2,...) AS (
SELECT 1, ..., ... UNION ALL
SELECT ...
)
MERGE dbo.tab1 trg
USING src
ON trg.id = src.id
WHEN MATCHED THEN UPDATE
...
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT
...
END
关键点:存储过程必须是idempotent。
这样,您始终可以确保表包含所需的输入数据,并且存储过程得到验证。
Kamil Nowinski 描述了类似的方法:
Script and deploy the data for database from SSDT project
优点:
存储过程是数据库项目的一部分。
它们将被验证和编译,因此您可以避免不受控制的代码的潜在错误
只有在发生变化时,SP 的变化才会出现在输出脚本中。
在运行前查看脚本更容易,因为它不包含不必要的代码
在部署后脚本中——只有一行代码永远不会改变。
【讨论】:
以上是关于部署 SQL SSDT 项目时如何跟踪数据更改的主要内容,如果未能解决你的问题,请参考以下文章