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



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

我想知道我是否可以有一些技术,将显示我数据库表的变化,因为我已经知道表的名称,通过改变我的意思是无论是更新或插入语句和什么确切地改变(列名和值插入/更新)。任何建议都非常感谢。我有IBM RAD和DB2数据库。谢谢。

在DB2中可以跟踪基本的审计信息。

DB2可以跟踪哪些数据被修改了,谁修改了数据,以及修改数据的SQL操作。

要跟踪数据何时被修改,请将表定义为系统周期时态表。关联历史表中的行开始列和行结束列包含有关数据修改发生时间的信息。

要跟踪哪些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;

在有限的时间内捕获有限数量的表的SQL语句——就我对您的问题的理解而言——可以通过DB2 Audit功能来解决。

create audit policy tabsql categories execute status both error type normal
audit <tabname> using policy tabsql

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

结束它
audit <tabname> remove policy

查看

db2audit

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

请注意,审计可以捕获大量数据,因此请确保在捕获必要的信息后再次关闭它。

最新更新