如何检测表是否在我的应用程序之外添加或删除了行?

时间:2012-06-13 16:29:17

标签: delphi firebird data-integrity integrity

这是一个特定的场景。我需要做的是:

  1. 如果有人在指定的表中插入或删除一行或多行 在我的应用程序的UI之外,它应该检测到该表 被修改了。
  2. 应该使用触发器。
  3. 这是需要做的事情:

    1. 区分是否已删除或插入。
    2. 检测进行了更改,或 更改
    3. 如果用户同时执行相同数量的插入和删除操作。从技术上讲,这可以算作更改,因此,不需要将其检测为插入和删除。
    4. 这是我们认为可以完成的工作:   创建一个表,用于存储监视的表名,它拥有的行数和验证密钥,让我们调用integrity_tbl。插入或删除后,更新行数和验证密钥。仅在验证密钥有效时才更新行数。每次比较失败时都会使验证密钥无效。需要进行数据完整性验证时,请计算表格中的行数并与integrity_tbl进行比较。

      你认为这是一个好方法还是我们应该尝试别的东西?

      我们正在使用Delphi和Firebird。 如我所知,我们正在使用IBX连接到数据库。但逻辑是问题,而不是访问数据库的方式。

2 个答案:

答案 0 :(得分:0)

从每个表计算MD5(或其他)校验和或签名,将其存储在某处,例如.ini文件,另一个表(特定于此目的)等。

答案 1 :(得分:0)

Firebird有一个非常好的机制,用于在数据库中的任何位置发生特定更改时通知客户端。该机制称为Firebird Events。阅读该文档以正确理解其运作方式。

通常,事件用于触发器或存储过程。您使用关键字POST_EVENT <event_name>将特定事件发送到所有连接的客户端。 <event_name>可以是最多127个字符的任何字符串。然后,在Delphi中,您需要使用名为TIBEvents的组件(或旧版Delphi中的TIBEventAlerter)。在那里,您使用Events属性指定您有兴趣接收的一个或多个<event_name>s。之后,您需要为TIBEvents.OnEventAlert编写代码,您可以在每次触发时对所有已注册事件做出反应。