【问题标题】:Determine which row updated or inserted in the sql server periodically确定在sql server中定期更新或插入哪一行
【发布时间】:2014-03-20 07:48:28
【问题描述】:

如果使用 java 技术发生任何更改,我正在尝试感知某些 sql server 2008 表的所有行。

我研究了一些方法,例如使用时间戳列、更改跟踪机制、更改数据捕获。

但以上所有方法都需要在数据库中进行一些自定义,如下所示:

1.Timestamps 列应该出现在每个表中。

2.更改跟踪需要每个表中的主键。

3.更改数据捕获需要创建一些系统表和其他自定义项。

我需要一些不需要在数据库中进行如此大量自定义的方法,因为数据库至关重要并且不允许更改配置设置。

任何人都可以在这方面提供帮助或建议吗?

【问题讨论】:

  • 使用触发器怎么样?你见过techexams.net/forums/sql-server-exams/…
  • 触发器与 CDC 的相似之处在于您需要创建它们以及存储更改所需的任何转储表。至于“使用 Java 技术的任何更改”,我能看到您这样做的最好方法是,如果您的所有 Java 软件都使用一些仅为他们保留的特定 SQL 登录名/用户,并且每次您的触发器/任何存储信息时都获取该信息.
  • 不,我不允许编写任何类型的触发器。正如我所说,我只能对数据库进行轻量级的更改。无法实现触发器和代码。

标签: java sql-server sql-server-2008


【解决方案1】:

以下更改可以完成数据审计

  1. 为所有 txn 表创建一个标识列。
  2. 将此身份数据与交易数据一起获取到前端。
  3. 为所有 txn 表创建历史记录表,并使用版本 ID 在每个事务之前移动原始数据。
  4. 在 UI 中修改后,将数据传回数据库,并使用 SQL MERGE 语句将数据与现有信息进行比较,以执行更新/插入/删除
  5. 使用以下逻辑将历史记录表中可用的最新版本与当前表中的数据进行比较

插入新数据 - 如果当前表中存在标识键并且在历史表的最新版本数据中不可用

WHERE C.IdentityColumn NOT IN(从历史 H 中选择 identitycolumn)

数据已删除 - 如果身份密钥存在于历史表的最新版本数据中且当前表中不存在。

WHERE H.IdentityColumn NOT IN(从当前 C 中选择标识列)

数据更新 - 如果当前表和最新版本的历史表中都存在标识键,并且任何一列数据被修改

WHERE (C.IdentityColumn = H.IdentityColumn) 和 ( C.Col1 H.Col1 或者 C.Col2 H.Col2 或者 C.ColN H.ColN )

C - 当前表 H - 历史表

使用上述逻辑,可以在单独的审计表中跟踪修改后的数据,该表可以包含记录 ID、字段名称、旧值、新值、修改、修改者、修改日期/时间等列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2020-11-21
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多