Sql 如何跟踪某些数据库表的更改?
我有一个程序,可以在五个表中获取用户并更新他/她的信息。这个过程相当复杂,因为它需要许多步骤(页面)才能完成。我有日志、sysout和syserr语句,它们可以帮助我在IDE控制台中查找sql查询,但它并没有所有这些语句。我已经花了很多天的时间通过调试来捕获其他丢失的查询,但到目前为止运气不好。我之所以这样做,是因为我想自动更新用户信息,这样我就不必在每个页面上手动输入用户详细信息Sql 如何跟踪某些数据库表的更改?,sql,db2,rad,Sql,Db2,Rad,我有一个程序,可以在五个表中获取用户并更新他/她的信息。这个过程相当复杂,因为它需要许多步骤(页面)才能完成。我有日志、sysout和syserr语句,它们可以帮助我在IDE控制台中查找sql查询,但它并没有所有这些语句。我已经花了很多天的时间通过调试来捕获其他丢失的查询,但到目前为止运气不好。我之所以这样做,是因为我想自动更新用户信息,这样我就不必在每个页面上手动输入用户详细信息 我想知道我是否可以使用一些技术来显示数据库表的更改,因为我已经知道了表名,我所说的更改是指是update还是ins
我想知道我是否可以使用一些技术来显示数据库表的更改,因为我已经知道了表名,我所说的更改是指是update还是insert语句,以及具体更改了什么(插入/更新的列名和值)。非常感谢您的建议。我有IBMRAD和DB2数据库。谢谢。在DB2中,您可以跟踪基本的审计信息 DB2可以跟踪修改了什么数据、谁修改了数据以及修改数据的SQL操作 要跟踪数据修改的时间,请将表定义为系统周期时态表。关联历史记录表中的“行开始”和“行结束”列包含有关数据修改发生时间的信息 要跟踪SQL修改数据的人和内容,可以使用非确定性生成的表达式列。这些列可以包含有助于审计目的的值,例如修改数据时当前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 special register的值
操作码列存储修改数据的SQL操作。此列定义为非确定性生成的表达式列,并存储指示SQL操作类型的值
假设您随后使用以下语句为TENTRABLE创建历史记录表,并将该历史记录表与TENTRABLE关联:
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审计工具解决
create audit policy tabsql categories execute status both error type normal
audit <tabname> using policy tabsql
创建审核策略选项卡SQL类别执行状态两种错误类型正常
使用策略tabsql进行审计
您必须在h数据库中拥有SECADM权限,第二个命令将启动审核过程。你可以用这个来阻止它
audit <tabname> remove policy
审核删除策略
查看
db2audit
命令来配置路径,并将数据从审核文件提取到一个分隔文件,然后可以将该文件再次加载到数据库中。
可以使用提供的sqllib/misc/db2audit.ddl脚本创建必要的表。您需要查询EXECUTE表以获取SQL详细信息
请注意,审计可以捕获大量数据,因此确保在获取必要信息后再次将其关闭。我的意思是,SQL跟踪可以让您接近这一点。什么DB2版本/平台?DB2不支持使用触发器吗?除了大量加载环境(如BI)外,触发器将是我跟踪SQL DB上更改的首选工具。@mustaccio版本10