【发布时间】:2017-07-13 09:53:22
【问题描述】:
在我们的 SQL Server 数据库部署期间,我们创建了一个临时表,其中包含特定表所需的新数据状态。然后我们将临时表合并到目标表中(我们实际上使用了单独的插入、更新和删除语句,但这可能不相关)。执行的插入/更新/删除被捕获并写入日志。
我们希望能够报告部署将应用哪些更改,而无需实际应用它们。目前这是通过在上述过程结束时回滚事务来完成的。不过这感觉不是特别好。
现在我们想做的是,我们将为表生成一个迁移脚本(生成一些执行必要的插入、更新和删除的 SQL 代码),而不是执行更改并将它们回滚。如果我们想做实际的部署,这段代码将被动态执行。如果没有,代码只会打印到日志中。
将一些可以为两个指定表生成迁移脚本的代码放在一起应该不会花很长时间,但我首先想验证是否已经没有可以执行此操作的现有工具?
在 Google 上搜索,我可以找到很多关于迁移整个数据库的讨论,但没有关于生成数据迁移脚本以有效地将一个表合并到另一个表。
所以我的问题是,有人知道这样的工具吗?
【问题讨论】:
-
您选择了什么解决方案?如果您正在使用插入、更新和删除语句,您不能在执行之前保存该脚本吗,因为这实际上是已应用内容的记录?
-
@DavidAtkinson 我们现在所做的与您所描述的相似。我们根据源和目标之间的连接选择一个 Actions_Planned 表变量,包括目标表中的所有现有值和源表中的新值。然后,我们从这个表变量中打印出计划的操作,包括旧的和新的列值。然后,如果我们想要实际执行更改,而不是将源表和目标表连接起来,我们将 Actions_Planned 表连接到目标表,并准确执行我们说要执行的操作。
-
我们还使用 OUTPUT 子句来填充 Actions_Performed 表变量,然后可以使用该变量来打印实际所做的更改。我们使用 Actions_Planned 表而不是源表来驱动更改的原因是,我们不会重复确定是否插入/更新/删除/什么都不做的逻辑,因此消除了报告一件事的风险和做别的事。
-
感谢分享。了解如何以不同方式解决问题总是很有趣!
标签: sql-server database tsql