Sql server SQL Server—验证SQL架构和种子数据的最佳方法

Sql server SQL Server—验证SQL架构和种子数据的最佳方法,sql-server,validation,testing,schema,Sql Server,Validation,Testing,Schema,我正在使用SQL Server后端开发一个基于web的应用程序。这是一个我几个月前才开始开发的遗留应用程序,数据库版本控制的情况有点混乱 有一组脚本用于新安装,另一组用于从一个版本升级到另一个版本。一些脚本更新模式,其他脚本插入种子数据。其他人,而不是开发人员,负责这些脚本的部署和运行。由于版本控制的情况,脚本有时会出现问题 我正在修改脚本,使其更耐烦,更不容易失败,并且在失败时有更好的日志记录 同时,我想做的是创建一个验证脚本,我们可以在部署之后运行它。脚本将运行并检查是否所有必要的表都与预期

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

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

我正在修改脚本,使其更耐烦,更不容易失败,并且在失败时有更好的日志记录

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


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

在版本化数据库中使用information\u模式将有助于实现这一点

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

选择ID=identitynt,1,1,表目录,表名称,列名称, 数据类型,序号位置,“1.0.1”为版本,GETDATE为VersionDate 从INFORMATION_SCHEMA.COLUMNS导入DBSCHEMA 按表格名称、序号位置排序

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

随着对数据库模式的后续更改,您将添加一个新版本,例如“1.0.2”,并将新模式插入到同一个表中,并每次增加版本

插入DBSCHEMA表格目录、表格名称、列名称、数据类型、序号位置、, 版本 选择表格目录、表格名称、列名称、数据类型、序号位置、“1.0.2”, GETDATE 从信息_SCHEMA.COLUMNS 按表格名称、序号位置排序

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

从上的DBSCHEMA T1内部联接DBSCHEMA T2中选择T1.TABLE_NAME、T1.COLUMN_NAME T1.TABLE\u NAME=T2.TABLE\u NAME 其中T1.VERSION='1.0.1' 和T1.Column_NAME不在DBSCHEMA的SELECT Column_NAME中,其中VERSION='1.0.2' 或者T1.TABLE_NAME不在DBSCHEMA的SELECT TABLE_NAME中,其中VERSION='1.0.2'

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


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

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

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


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

为什么不从新安装开始设置数据库项目,更新每个版本,并为每个版本创建源代码管理提交。最终的项目将是您部署的项目,除非您想要一个早期版本,您可以通过检查我们使用tsqlt进行测试的特定版本commitWe来提取该版本。您可以在数据和模式上部署测试。如果您使用redgate和tsqlt,您将
我能够测试新的模式,一旦它们被改变,你就不会期望你的测试用例会失败。另一种方法是将redgate源代码控制与git结合使用;代码比较和撤销非常好这个想法很好,但除了表和列名的更改之外,没有考虑其他因素。您的解释说“检查所有必要的表是否都在预期的架构中,以及种子数据脚本是否运行”,并且没有提到其他对象。我提供的解决方案可以解决这些问题。即使这不是一个完整的解决方案,也不值得投反对票。我不是投反对票的人,尽管我确实需要比较所有的模式对象,不仅仅是表,但它仍然很有用。