1

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

要求:

  • 易于编写新规则或检查
  • 易于运行所有规则,规则子集的分组将是一个奖励
  • 在规则执行时或执行后准确和简单地报告规则

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

一些规则示例:

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

6 回答 6

1

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

我建议熟悉对象角色建模,以此来设计具有更细粒度约束集的关系数据,包括您描述的检查类型。

于 2009-06-14T16:38:33.687 回答
1

看起来您正在寻找一个允许您声明任意复杂度的数据库约束的系统。我假设您想在违反约束的那一刻就发现它们,而不是在某些事后验证程序中。

为此,您需要一个关系 DBMS,唉,这样的东西还不存在。

要在 SQL 系统中做到这一点,您唯一的选择是编写大量约束执行代码并将它们存储在触发器等中。如果由于政治等原因,这是不可能的,那么目前您的问题没有可行的解决方案。

当心那些指导您使用无法与 DBMS 本身紧密耦合的对象解决方案的人。最终,有人会部署一些代码来绕过您的外部 dbms 约束执行规则,让您在决定提出这个问题时准确地留在原地。

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

根据理论,所有数据库约束都可以表述为“要求其结果始终为空的查询”。因此,例如,这样的查询会给您“所有具有相同键值的不同行对”之类的东西,或者,一般来说,这样的查询会为您提供“所有错误的事情”的列表。

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

于 2009-06-14T17:37:19.070 回答
1

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

  1. 在数据库中尽可能多地使用唯一约束、外键等强制执行。尽管如此,在很多情况下,您确实无法将所有内容都编码为约束。例如,空表始终满足约束条件,因此您必须有一个异常报告来告诉您何时表意外为空。

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

  3. 创建一个主存储过程 ( usp_Integrity_Master),它要么显式调用所有这些存储过程,要么使用带有光标的动态 SQLINFORMATION_SCHEMA来查找适当的过程并按顺序调用它们,将所有结果记录到适当的表中并触发电子邮件、报告或任何。

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

于 2009-06-14T18:08:00.087 回答
1

正如您从此处的响应中看到的那样,对数据运行非内联定期检查的想法并不是很流行。但是,如果您以“存在哪些工具可以让我监控系统中的数据状态,如我们定义的规则所表达的那样”的形式重新提出您的问题,那么您所谈论的是一类解决方案,这里的大多数人可能利用。

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

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

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

于 2009-06-14T19:07:21.613 回答
0

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

于 2009-06-14T17:41:44.177 回答
0

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

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

于 2014-09-12T00:25:15.553 回答