如何跟踪某些数据库表的更改?

时间:2016-06-29 15:15:15

标签: sql db2 rad

我有一个程序,它接受用户并在五个表中更新关于他/她的信息。该过程相当复杂,因为它需要完成许多步骤(页面)。我有日志,sysout和syserr语句,可以帮助我在IDE控制台中查找SQL查询,但它没有所有这些查询。我已经花了很多天时间通过调试来查找其他缺少的查询,但到目前为止还没有运气。我这样做的原因是因为我想自动更新用户信息,所以我不必通过每个页面手动输入用户详细信息。

我想知道我是否可以使用一些技术来显示数据库表的更改,因为我已经知道表名,通过更改我的意思是它是更新还是插入语句以及确切更改的内容(列名和值已插入/更新) 。任何意见是极大的赞赏。我有IBM RAD和DB2数据库。感谢。

2 个答案:

答案 0 :(得分:0)

在DB2中,您可以跟踪基本审核信息。

DB2可以跟踪修改的数据,修改数据的人员以及修改数据的SQL操作。

要跟踪数据的修改时间,请将表定义为系统周期时态表。关联历史记录表中的row-begin和row-end列包含有关何时发生数据修改的信息。

要跟踪SQL修改数据的人和内容,可以使用非确定性生成的表达式列。这些列可以包含有助于审计目的的值,例如修改数据时CURRENT SQLID专用寄存器的值。非确定性生成的表达式列的可能值在CREATE TABLE和ALTER TABLE语句的语法中定义。

例如

CREATE TABLE TempTable (balance INT, 
              userId VARCHAR(100) GENERATED ALWAYS AS  ( SESSION_USER ) ,  
              opCode CHAR(1) 
                          GENERATED ALWAYS AS ( DATA CHANGE OPERATION )  
              ... SYSTEM PERIOD (SYS_START, SYS_END));

userId列存储修改数据的人员。此列定义为非确定性生成的表达式列,其中包含SESSION_USER特殊寄存器的值。

opCode列存储修改数据的SQL操作。此列定义为非确定性生成的表达式列,并存储一个指示SQL操作类型的值。

假设您使用以下语句为TempTable创建历史表并将该历史表与TempTable相关联:

CREATE TABLE TempTable_HISTORY (balance INT, user_id VARCHAR(128) , op_code CHAR(1) ... );

ALTER TABLE TempTable ADD VERSIONING 
                 USE HISTORY TABLE TempTable_HISTORY     ON DELETE ADD EXTRA ROW;

答案 1 :(得分:0)

使用DB2 Audit工具可以解决在有限数量的表和有限时间内捕获SQL语句的问题 - 据我了解您的问题。

create audit policy tabsql categories execute status both error type normal

audit <tabname> using policy tabsql

您必须在theh数据库中拥有SECADM权限,第二个命令将启动审核过程。你可以用

来阻止它
audit <tabname> remove policy

查看

  

db2audit

命令用于配置路径并将审计文件中的数据提取到分隔文件,然后可以将其再次加载到数据库中。 可以使用提供的sqllib / misc / db2audit.ddl脚本创建必需的表。您将需要查询EXECUTE表以获取SQL详细信息

请注意,审核可以捕获大量数据,因此请务必在获取必要信息后再将其关闭。