我想创建一个历史表来跟踪 DB2 中多个表的字段更改。
我知道历史通常是通过复制整个表的结构并给它一个后缀名来完成的(例如 user --> user_history)。然后,您可以使用一个非常简单的触发器将旧记录复制到 UPDATE 的历史记录表中。
但是,对于我的应用程序,这会占用太多空间。每次字段更改时将整个记录复制到另一个表似乎不是一个好主意(至少对我而言)。所以我想我可以有一个通用的“历史”表来跟踪各个字段的变化:
CREATE TABLE history
(
history_id LONG GENERATED ALWAYS AS IDENTITY,
record_id INTEGER NOT NULL,
table_name VARCHAR(32) NOT NULL,
field_name VARCHAR(64) NOT NULL,
field_value VARCHAR(1024),
change_time TIMESTAMP,
PRIMARY KEY (history_id)
);
好的,所以我要跟踪的每个表都有一个自动生成的 id 字段作为主键,它将被放入“record_id”字段中。并且表中的最大 VARCHAR 大小为 1024。显然,如果非 VARCHAR 字段发生更改,则必须在将记录插入历史表之前将其转换为 VARCHAR。
现在,这可能是一种完全迟钝的做事方式(嘿,如果是这样,请告诉我为什么),但我认为这是一种跟踪更改的好方法,这些更改需要很少被拉起并且需要存储一段时间多少时间。
无论如何,我需要帮助编写触发器以在更新时将记录添加到历史表中。让我们以一个假设的用户表为例:
CREATE TABLE user
(
user_id INTEGER GENERATED ALWAYS AS IDENTITY,
username VARCHAR(32) NOT NULL,
first_name VARCHAR(64) NOT NULL,
last_name VARCHAR(64) NOT NULL,
email_address VARCHAR(256) NOT NULL
PRIMARY KEY(user_id)
);
那么,任何人都可以帮助我触发更新用户表以将更改插入历史表吗?我的猜测是需要使用一些过程 SQL 来遍历旧记录中的字段,将它们与新记录中的字段进行比较,如果它们不匹配,则在历史表中添加一个新条目。
如果可能的话,最好对每个表使用相同的触发器操作 SQL,而不管其字段如何。
谢谢!