代码之家  ›  专栏  ›  技术社区  ›  Peter Oehlert

数据库一致性检查框架

  •  1
  • Peter Oehlert  · 技术社区  · 15 年前

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

    要求:

    • 易于编写新规则或支票
    • 易于运行所有规则,规则子集的分组将是一个额外的好处
    • 准确、简单地报告规则执行时或执行后的情况

    我自己也要写这样的东西,但我想我会先看看是否能找到别的东西。我搜了一下,但什么也找不到。

    一些规则示例:

    • 确保在每个具有[rank]n的记录的子表中,n为0,或者存在具有[rank]n-1的记录。例如,对于给定的父记录,子记录的秩总是从0单调增加到max(秩)。
    • 我们的数据库使用一个全局“type/id”系统,其中有一个masterentity表,它是系统中每个实体的头表。每个实体类型都属于一个或多个特定实体表,每个实体表只允许一个或多个特定类型。检查系统中的所有实体在其相应的实体表中是否有正确的记录。
    • 确保所有安全类型在安全描述符表中都有一个条目
    6 回复  |  直到 10 年前
        1
  •  1
  •   dkretz    15 年前

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

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

        2
  •  1
  •   Cade Roux    15 年前

    我什么都不知道。这可能是因为大多数dba相当保守,可能不允许将一组现成的东西放入其数据库中。

    1. 在数据库中尽可能多地执行具有唯一约束、外键等的操作。尽管如此,经常有许多情况下,您不能真正将所有内容编码成约束。例如,空表总是满足约束,因此必须有一个异常报告来告诉您表何时意外为空。

    2. 使用一致的命名约定(即 usp_Integrity_XXXX )

    3. 创建主存储过程( usp_Integrity_Master )或者显式调用所有存储过程,或者在 INFORMATION_SCHEMA 要找到合适的过程并按顺序调用它们,请将所有结果记录到适当的表中,然后发送电子邮件、报告或其他内容。

    在之前的一次工作中,我实际上有一个代理工作,称为每个数据库的主完整性检查,并通过电子邮件发给我。(实际上,有些个别问题是通过电子邮件发送给负责跟踪和解决问题的适当工作人员的。尤其是在集成场景中,您不能仅仅阻止外部信息的传入,您必须让它无效地传入,并在稍后尝试更正它)

        3
  •  1
  •   Erwin Smout    15 年前

    似乎您正在寻找一个允许您声明具有任意复杂度的数据库约束的系统。我假设你想在违反约束的那一刻抓住它们,而不是在一些事后验证过程中。

    要做到这一点,您需要一个关系数据库管理系统,唉,这样的事情还不存在。

    要在sql系统中实现这一点,您唯一的选择是编写大量的约束执行代码,并将这些代码保存在触发器等中。如果这是不可能的,由于政治等原因,目前没有工作解决你的问题。

    当心那些引导您找到不能与dbms本身紧密耦合的对象解决方案的人。最终,有人会部署一些代码,绕过dbms约束实施规则之外的代码,让您在决定问这个问题时保持原样。

    我同意斯普利夫。事后约束检查在我看来也是一个愚蠢的想法。但如果这是你真正想要的,那么这里有一个可能的方法:

    根据理论,所有数据库约束都可以表述为“一个查询结果总是空的查询”。因此,这样一个查询会给出类似于“具有相同键值的所有不同行对”的内容,或者,一般来说,这样一个查询会给出一个“所有错误的内容”的列表。

    以每个可能违反的约束一个的速度写下查询/脚本,并在一夜之间运行这些查询/脚本。测试它们是否返回非空结果。

        4
  •  1
  •   Steve Broberg    15 年前

    从这里的响应可以看出,对数据运行非内联定期检查的想法并不流行。然而,如果你将你的问题重新定义为“现有哪些工具允许我监控系统中数据的状态,正如我们定义的规则所表达的那样”,那么你说的是一类解决方案,这里的大多数人可能都会用到。

    例如,我相信这里的大多数DBA都会提倡监视跟踪某些表大小的脚本,或者检查空闲一段时间的数据,等等。脚本的成功或失败并不构成损坏的架构,但实际上是执行某种维护或调查的信号。

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

    这是一个很大的领域-只是谷歌周围的“应用程序监测”,并找到一个适合你的需要的产品。

        5
  •  0
  •   SpliFF    15 年前

    好吧,您可以将正确的答案(约束和触发器)与错误的答案(事后测试)混合起来,方法是使用约束构建第二个相同的数据库,然后尝试迁移数据。如果新数据库在尝试插入时出现抖动,则会发现错误。一旦你的“政治”问题得到解决,你就可以永久地迁移整个事情。

        6
  •  0
  •   Hieu Nguyen    10 年前

    我会推荐bg基准( http://www.bgbenchmark.org )这是一个用于评估不同数据存储(包括SQL和NoSQL数据存储)的基准。它的一个独特特性是能够量化过时数据的数量,而其他基准或框架没有提供这些数据。

    目前bg对支持社交网络的数据和操作进行建模。你可以定义你的行为符合你的规则。