数据库一致性检查框架

时间:2009-06-14 16:31:58

标签: sql database testing frameworks consistency

我正在寻找一个框架,用于将大量数据库一致性检查规则集成到我们的系统中。这基本上应该是我们数据库检查的自动化测试用例运行器。

要求:

  • 易于编写新规则或检查
  • 轻松运行所有规则,对规则子集进行分组将是一个奖励
  • 执行或执行后规则的准确而简单的报告

我打算自己写这样的东西,但我想我会先看看能不能找到别的东西。我用谷歌搜索但找不到任何东西。

一些规则示例:

  • 确保在[Rank] N的每条记录的子表中,N为0或者有[Rank] N-1的记录。例如。对于给定的父母,子记录将始终从0到MAX(等级)单调增加等级。
  • 我们的数据库使用全局“类型/ ID”系统,该系统具有单个MasterEntity表,该表是系统中每个实体的标头表。每个实体类型属于一个或多个特定实体表,每个实体表仅允许一个或多个特定类型。检查系统中的所有实体是否在其相应的实体表中都有正确的记录。
  • 确保所有安全类型在我们的安全描述符表中都有一个条目

6 个答案:

答案 0 :(得分:1)

几乎所有这些都可以使用触发器来处理增强的完整性约束。

我建议熟悉Object Role Modeling作为一种使用更细粒度的约束集设计关系数据的方法,包括您描述的检查类型。

答案 1 :(得分:1)

您似乎正在寻找一个允许您声明任意复杂性的数据库约束的系统。我假设您想要在制作时发现违反约束的行为,而不是在事后验证程序中。

要做到这一点,你需要一个关系型DBMS,唉,这样的事情还不存在。

要在SQL系统中执行此操作,您唯一的选择是编写大量约束强制执行代码并将其存储在触发器等中。如果由于政治原因而无法解决问题,那么目前没有解决问题的方法。

请注意那些指导您使用无法与DBMS本身紧密耦合的对象解决方案的人。最终,有人会部署一些代码来绕过您的dbms外部约束执行规则,从而使您确切地知道在您决定提出此问题时的位置。

我同意斯普利夫的观点。事后约束检查对我来说似乎也是一个愚蠢的想法。但如果那是你真正想要的,那么这是一种可能的方法:

根据理论,所有数据库约束都可以表述为“结果必须始终为空的查询”。所以这样的查询会给你一些类似“具有相同键值的所有不同行对”,或者,一般来说,这样的查询会给你一个“所有错误的东西”的列表。 / p>

以每个可能违反的约束的速率写下查询/脚本,并在一夜之间运行。测试其中是否有任何返回非空结果。

答案 2 :(得分:1)

我什么都不知道。这可能是因为大多数DBA都相当保守,并且可能不允许将开箱即用的东西放到他们的数据库中。

  1. 使用唯一约束,外键等在数据库中尽可能多地强制执行。尽管如此,通常有很多情况下您实际上无法将所有内容编码为约束。例如,一个空表总是满足约束条件,所以你必须有一个异常报告来告诉你表是否意外为空。

  2. 使用一致的命名约定(即usp_Integrity_XXXX)将所有异常处理封装到单个粒度存储过程中。

  3. 创建一个主存储过程(usp_Integrity_Master),它可以显式调用所有存储的过程,也可以使用INFORMATION_SCHEMA上的游标使用动态SQL来查找相应的过程并按顺序调用它们,将所有结果记录到适当的表格并发送电子邮件,报告或其他任何内容。

  4. 在之前的一次演出中,我实际上有一个代理作业,它调用了每个数据库的主完整性检查,并通过电子邮件发送给我。 (实际上,一些个别问题通过电子邮件发送给负责追踪和修复问题的相应工作人员。特别是在集成方案中,您不能只是阻止外部信息进入,您必须让它无效并尝试在以后更正)

答案 3 :(得分:1)

从这里的回答中可以看出,对数据进行非内联定期检查的想法并不是很受欢迎。但是,如果您以“允许我监视系统中的数据状态的哪些工具存在,正如我们定义的规则所表达的那样”重新构建您的问题,那么您谈论的是一类解决方案,大多数人可能在这里使用

例如,我确信这里的大多数DBA都会提倡监视跟踪某些表大小的脚本,或检查已经空闲一段时间的数据,等等。脚本的成功或失败不会构成腐败的架构,而是进行某种维护或调查的信号。

我们使用Nagios作为系统监控解决方案。它所做的就是让你定义规则,这些规则通过运行脚本来检查 - 在我们的例子中是由数据库的命令行界面(sqlplus for Oracle)运行的.sql文件。脚本必须返回pass,fail或warn值。您可以设置如何获得通知(邮件,分页等)以及何时(每次失败,或者只是第一次失败,直到它被成功“清除”)并且它会跟踪事件的历史记录。至于规则本身,就点和点而言,没有“框架”。点击约束强制执行 - 您必须能够通过编写自己的sql来表达规则。

这是一个很大的领域 - 只需谷歌“应用程序监控”,找到适合您需求的产品。

答案 4 :(得分:0)

您可以通过使用约束构建第二个相同的数据库然后尝试迁移数据,将正确的答案(约束和触发器)与错误的答案(事后测试)混合在一起。如果新数据库在您尝试INSERT时发生抖动,则表示您发现了错误。一旦你的“政治”问题得到解决,你就可以永久地迁移整个事物。

答案 5 :(得分:0)

我会推荐BG基准(http://www.bgbenchmark.org)。这是用于评估不同数据存储(SQL和NoSQL数据存储)的基准。它的一个独特功能是能够量化陈旧数据的数量,而其他基准或框架则不提供这些数据。

目前,BG为支持社交网络的数据和行动建模。您可以定义符合规则的行为。