SQL Server-验证SQL模式和种子数据的最佳方式



我正在开发一个带有SQL Server后端的基于web的应用程序。这是一个有点遗留的应用程序,我几个月前刚刚开始开发,数据库版本控制的情况有点混乱。

有一组脚本用于新安装,另一组用于从版本升级到版本。一些脚本更新模式,另一些则插入种子数据。部署和运行这些脚本的是其他人,而不是开发人员。由于版本控制的情况,脚本有时会出现问题。

我正在修改脚本,使其更加顽强,不太可能失败,并且在失败时有更好的日志记录。

同时,我想做的是创建一个验证脚本,我们可以在部署后运行。脚本将运行并检查是否所有必要的表都与预期的架构在一起,种子数据脚本是否运行,一切都是应该的。除了编写大量"if not exists"(写入日志(类型的语句外,还有更好的方法吗?

我有时可以使用VisualStudio模式比较来将新更新的数据库与现有数据库进行比较,但数据比较在我们的环境中是不可行的。

我在一些项目中遇到了同样的情况,我使用了以下方法:我已经编写了一个脚本,它从DB中收集所有重要数据(表、列、它们的顺序\类型…、索引等,甚至存储过程的描述(作为XML,然后计算它的哈希值。然后脚本将计算出的哈希值与预期值(在开发环境中计算(进行比较。

因此,我有一种非常简单的方法来检查数据库的一致性,就像在开发之前一样,以确保在测试和生产部署期间我有一个实际的数据库状态,从而确保所有预期的更改都包含在发布中。

我想,您可以使用类似的方法,但也可以在重要数据列表中包含一些额外的信息来控制种子数据。当然,将所有数据的哈希计算到数据库中不是一个好主意,但如果你了解你的数据库,你可以找到简单的符号来控制它(行数、最大Id、上次修改日期等(

在版本化的数据库中使用INFORMAION_SCHEMA将对此有所帮助。

  1. 首先创建一个名为DBSCHEMA的持久化表,以存储数据库的所有版本以及您要跟踪的数据库的初始版本:

    SELECT ID=IDENTITY(int,1,1(,TABLE_CATALOG,TABLE_NAME,COLUMN_NAME,DATA_TYPE,ORDINAL_POSITION,"1.0.1"作为版本,GETDATE((作为版本日期从INFORMATION_SCHEMA.COLUMNS进入DBSCHEMA按表名排序,序号位置

注意:在精度、文本长度等方面,你可以从信息模式中获得比你需要的更多的列。我没有包括这些。

  1. 随着对数据库架构的后续更改,您将添加一个新版本,例如"1.0.2",并将新架构插入到同一表中,每次都增加版本。

    插入DBSCHEMA(TABLE_CATALOG、TABLE_NAME、COLUMN_NAME、DATA_TYPE、ORDINAL_POSITION,版本,版本日期(选择TABLE_CATALOG、TABLE_NAME、COLUMN_NAME、DATA_TYPE、ORDINAL_POSITION、'1.0.2',获取日期((来自INFORMATION_SCHEMA.COLUMNS按表名排序,序号位置

  2. 现在,在您拥有多个版本后,您可以使用类似于以下的查询来检查版本之间的更改,以查看数据库中哪些表发生了更改。我会根据是否要查找已更改的表或列来对此进行更改。

    从DBSCHEMA T1中选择T1.TABLE_NAME、T1.COLUMN_NAME INNER JOIN DBSCHEMA T2 ONT1.TABLE_NAME=T2.TABLE_NAME其中T1.VERSION='1.0.1'AND T1.Column_NAME NOT IN(从DBSCHEMA中选择Column_NAME,其中VERSION='1.0.2'(或T1.TABLE_NAME不在中(从DBSCHEMA中选择TABLE_NAME,其中VERSION='1.0.2'(

此查询的结果将为您提供表和列所发生的更改,但如果需要更多信息,您可以获得更精细的信息,并检查数据类型、精度等。(可能有一个CTE查询更适合最后一个查询,但上面的查询让您了解了如何查找版本之间的更改。(

关于种子数据,我将为此创建另一个表,该表使用与您在DBSCHEMA中插入的版本相同的版本,并存储包含种子数据的每个表的表名和计数(*(。这将允许您查看它是否存在,和/或种子数据的计数是否在不同版本之间发生了变化。

最新更新