部署SQL SSDT项目时如何跟踪数据更改

部署SQL SSDT项目时如何跟踪数据更改,sql,visual-studio-2015,sql-server-data-tools,database-project,Sql,Visual Studio 2015,Sql Server Data Tools,Database Project,我们使用SSDT DACPAC部署升级数据库。开发人员在VisualStudio 2015中处理项目,根据需要修改模式 开发人员还将部署前和部署后脚本添加到项目中。其中一些脚本确保某些表中始终包含预期的数据。其他人在平台升级过程中添加、移动或修改数据 我们需要改进数据库部署期间生成的输出,以便在部署之后,我们有一个人类可读的列表,其中包含作为部署一部分而更改的任何数据 我目前正在考虑两种方法。但两者似乎都不理想。它们是: 1) 手动将日志添加到项目中的所有Pre和Post脚本中。这当然是一个选择

我们使用SSDT DACPAC部署升级数据库。开发人员在VisualStudio 2015中处理项目,根据需要修改模式

开发人员还将部署前和部署后脚本添加到项目中。其中一些脚本确保某些表中始终包含预期的数据。其他人在平台升级过程中添加、移动或修改数据

我们需要改进数据库部署期间生成的输出,以便在部署之后,我们有一个人类可读的列表,其中包含作为部署一部分而更改的任何
数据

我目前正在考虑两种方法。但两者似乎都不理想。它们是:

1) 手动将日志添加到项目中的所有Pre和Post脚本中。这当然是一个选择。但这并不理想,因为它使升级脚本复杂化,有时开发人员可能会错过或错误地完成。由于目标是检测部署过程中发生的意外数据更改,因此这种不确定性非常糟糕。最好是通用解决方案

2) 以下是我对通用解决方案的最佳尝试:作为部署过程的一部分,为数据库中的所有用户表启用SQL更改数据捕获。然后,在部署结束时,收集所有捕获的更改并禁用CDC。我真的让它工作了。但是在数据库中的所有表上启用CDC的过程需要几分钟(我们的一个数据库有775个表,在所有表上启用CDC大约需要3分钟)。这种方法也让人感觉非常。。。重

我的问题是。如果部署运行任意的部署前和部署后脚本,是否有更好的方法来实现可靠地生成作为数据库部署一部分更改的数据报告的目标

如果没有更好的方法,我将非常感谢对选项2的反馈。我考虑这件事疯了吗

其中一些脚本确保某些表中始终包含预期的数据

首先,未验证部署前/部署后脚本。我更喜欢将它们仅用作启动点,并在存储过程中执行实际工作

因此,与其写:

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
关键点:存储过程必须是

通过这种方式,您可以始终确保表包含所需的输入数据,并且验证了存储过程


Kamil Nowinski描述了类似的方法:

优点:

存储过程是数据库项目的一部分

它们将被验证和编译,因此您可以避免不受控制代码的潜在错误

仅当某些内容发生更改时,SP的更改才会显示在输出脚本中。

在运行之前查看脚本更容易,因为它不包含不必要的代码

在部署后脚本中–只有一行代码永远不会更改


我也在SSDT DATAWAWHORKE项目中工作,我们使用VN来跟踪更改并跟踪当前代码,您是否考虑将整个项目放到一个SvN存储库中?是的,我们将项目保留在SVN中。我在这里感兴趣的是报告在部署时由项目中的pre和post脚本更改的数据。您能否与开发人员一起将PRINT语句添加到pre/post脚本中,以解释他们在做什么?也许可以创建一个模板供他们使用/复制,其中包括每个脚本的开始/停止时间,以及一些关于脚本正在做什么的快速说明?