Ich möchte eine Historientabelle erstellen, um Feldänderungen in einer Reihe von Tabellen in DB2 zu verfolgen.
Ich weiß, dass die Historie in der Regel durch das Kopieren der gesamten Tabellenstruktur und die Vergabe eines Namens mit Suffix erfolgt (z. B. user --> user_history). Dann können Sie einen ziemlich einfachen Trigger verwenden, um den alten Datensatz bei einem UPDATE in die History-Tabelle zu kopieren.
Für meine Anwendung würde dies jedoch zu viel Platz beanspruchen. Es scheint (zumindest mir) keine gute Idee zu sein, jedes Mal, wenn sich ein Feld ändert, einen ganzen Datensatz in eine andere Tabelle zu kopieren. Also dachte ich, ich könnte eine allgemeine "Verlaufstabelle" haben, die einzelne Feldänderungen nachverfolgen würde:
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)
);
OK, also jede Tabelle, die ich verfolgen möchte, hat ein einzelnes, automatisch generiertes id-Feld als Primärschlüssel, das in das Feld "record_id" gesetzt wird. Und die maximale VARCHAR-Größe in den Tabellen beträgt 1024. Wenn sich ein Nicht-VARCHAR-Feld ändert, muss es natürlich in ein VARCHAR-Feld konvertiert werden, bevor der Datensatz in die Verlaufstabelle eingefügt wird.
Nun, das könnte eine völlig bescheuerte Art sein, Dinge zu tun (hey, lassen Sie mich wissen, warum, wenn es so ist), aber ich denke, es ist eine gute Möglichkeit, Änderungen zu verfolgen, die selten abgerufen werden müssen und für eine beträchtliche Zeitspanne gespeichert werden müssen.
Wie auch immer, ich brauche Hilfe beim Schreiben des Triggers zum Hinzufügen von Datensätzen zur Verlaufstabelle bei einer Aktualisierung. Nehmen wir zum Beispiel eine hypothetische Benutzertabelle:
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)
);
Kann mir also jemand mit einem Trigger helfen, der bei einer Aktualisierung der Benutzertabelle die Änderungen in die Verlaufstabelle einfügt? Ich vermute, dass eine prozedurale SQL-Anweisung verwendet werden muss, um die Felder des alten Datensatzes in einer Schleife zu durchsuchen, sie mit den Feldern des neuen Datensatzes zu vergleichen und dann, wenn sie nicht übereinstimmen, einen neuen Eintrag in die Verlaufstabelle einzufügen.
Es wäre besser, für jede Tabelle unabhängig von ihren Feldern dieselbe Triggeraktion SQL zu verwenden, wenn dies möglich ist.
Merci !