Я хочу создать таблицу истории, чтобы отслеживать изменения полей в нескольких таблицах в DB2.
Я знаю, что история обычно делается с копированием структуры всей таблицы и присвоением ей суффиксного имени (например, user -> user_history). Затем вы можете использовать довольно простой триггер, чтобы скопировать старую запись в таблицу истории при ОБНОВЛЕНИИ.
Однако для моего приложения это заняло бы слишком много места. Не кажется хорошей идеей (по крайней мере, мне) копировать всю запись в другую таблицу каждый раз, когда поле изменяется. Поэтому я подумал, что у меня может быть общая таблица истории, которая будет отслеживать изменения отдельных полей:
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)
);
ОК, поэтому каждая таблица, которую я хочу отслеживать, имеет одно автоматически генерируемое поле идентификатора в качестве первичного ключа, которое будет помещено в поле 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-код действия триггера для каждой таблицы, независимо от ее полей, если это возможно.
Спасибо!