然而,对于我的应用程序来说,这将使用太多空间。我认为每次字段更改都将整个记录复制到另一个表中似乎不是一个好主意(至少对我来说不是)。因此,我想我可以有一个通用的“历史”表,它将跟踪单个字段的更改:
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,而不管其字段。
谢谢!