Historize

Das Modul erstellt eine Historie einer Datenbank, sodass die Versionen, die zu bestimmten Zeitpunkten existiert haben, nachvollzogen werden können. Dazu benötigt es die Quellabfrage, die historisiert werden soll, und eine Zieldatei, in der der Änderungsverlauf festgehalten wird.

Siehe hierzu Datenhistorisierung / -versionierung

Name Bedeutung
Modul History
Modulklasse DsModTemplateSQL
Typ Java
Zweck Basierend auf einen definierten Primärschlüssel sollen die Daten der angegebenen SQL-Abfrage in die Zieltabelle historisch integriert werden
Transformationscode SQL Abfrage
Quellen Quelltabellen in einer Datenbank
Ziele Zieltabelle in derselben Datenbank

Beschreibung

Dieses Modul ermöglicht es, Daten aus aktueller Sicht in eine Tabelle mit historischer Sicht zu integrieren.

Das Ergebnis der angegebenen Abfrage wird in die Perioden der Zieltabelle hinzugefügt.

Hierzu muss zwangsweise ein technischer oder fachlicher Schlüssel angegeben werden, der als Basis für die historisch korrekte Periodenbildung verwendet wird. Der Schlüssel der Quellabfrage zuzüglich der Periode (Anfang bzw. Ende, da es in Datenbanken keinen Datentypen für Perioden gibt) bilden den technischen Schlüssel der Zieltabelle.

Das folgende Beispiel zeigt, wie man mit Hilfe des Moduls eine die Historie einer Quellinformation aufbauen kann. Zunächst die verwendete SQL-Abfrage:

SELECT r.r_regionkey AS region_key
     , r.r_name region_name
     , n.n_nationkey AS nation_key
     , n.n_name nation_name
  FROM stage.region r
     , stage.nation n
 WHERE 1 = 1
   AND n.n_regionkey = r.r_regionkey

Die Zieltabelle hat folgende Spalten:

Spalte
region_key
region_name
nation_key
nation_name
valid_from_dt
invalid_from_dt

Als Schlüssel wird die Spalte region_key angegeben.

Nun werden beim regelmäßigen (typischerweise täglichen) Ausführen dieser Transformation die aktuellen Daten der Quellabfrage in die Zieltabelle integriert. Ändert sich zu einem Primärschlüssel nichts, dann ändern sich auch nicht die Daten zu diesem Primärschlüssel in der Zieltabelle. Ändern sich die Daten zu einem Primärschlüssel, wird die aktuelle Periode gschlossen und eine neue Periode mit den geänderten Daten wird angelegt.

Die Anzahl der generierten SQL-Statements (Insert / Update oder Merge), um die Historisierung durchzuführen, ist abhängig von der gewählten Konstellation (mit/ohne Löschflag, mit/ohne Löschen, mit Aktivkennzeichen) und der eingesetzten Datenbank. Derzeit gibt es nur Implementierungen für Exasol, PostgreSQL und Oracle.

Datenquellen

Die Quellen des Moduls sind Tabellen, die über die vom datasqill Entwickler definierte Abfrage gelesen werden. Für diese Tabellen muss der datasqill Laufzeit-Benutzer Leserechte besitzen. Alle in der SQL-Abfrage verwendeten Quelltabellen müssen über die datasqill GUI im grafischen Datenmodell mit dem Eingang des Moduls verbunden werden.

Datenziel

Das Ziel des Moduls ist eine einzelne Tabelle. Die Tabelle muss in der gleichen Datenbank liegen, wie die Quelltabellen. Für diese muss der datasqill Laufzeit-Benutzer Schreibrechte besitzen. Die Zieltabelle muss mit Hilfe der datasqill GUI im grafischen Datenmodell mit dem Ausgang des Moduls verbunden werden.

Attribute

Im Auslieferungszustand bietet das Modul folgende Attribute in der GUI für den datasqill Entwickler an:

Name Typ Bedeutung
Join Key Columns Required Column List Der Text "RL:" gefolgt von einer kommaseparierten Liste der Spalten, die für die Join-Bedingung verwendet werden sollen. Per Voreinstellung steht dort "RL:${tgt_pk_list}". Dabei wird die Variable tgt_pk_list durch die Liste der Primärspalten der Zieltabelle ersetzt
With Delete Boolean Wenn enabled, dann werden in der Zieltabbelle alle Daten logisch gelöscht, die nicht mehr in der Quellabfrage vorhanden sind
Ignore Columns Optional Column List Der Text "OL:" gefolgt von einer kommaseparierten Liste der Spalten, die beim Vergleich ignoriert werden sollen und nur dann in die Zieltabelle kommen, wenn sich andere Spalten ändern
Inplace Columns Optional Column List Der Text "OL:" gefolgt von einer kommaseparierten Liste der Spalten, die beim Vergleich ignoriert werden sollen und bei Änderung in der aktuellen Periode (inplace) ohne Historisierung überschrieben werden
Skip if empty Boolean Wenn enabled, dann wird nichtts ausgeführt, wenn die Quelle leer ist. Wird ignoriert, wenn "Error if empty" gesetzt ist
Error if empty Boolean Wenn enabled, dann wird ein Fehler erzeugt

Variationen

Bei der Installation des Modules kann man weitere Attribute einstellen

Historisierung mit Schleife

Das Modul lässt sich derart erweitern, dass man das Attribut "Loop Query" aktiviert (siehe Einstellen von Modul-Attributen im Anhang):

Name Typ Bedeutung
Loop Query SQL Schleifenabfrage um die Ergebnisse in der Hauptabfrage zu verwenden.

Dann hat man zusätzlich ein weiteres Attribut in dem man eine Query eingeben kann. Wenn man eine Loop-Query erfasst, dann führt das Modul pro gefundenen Datensatz die Hauptquery aus. Hierbei kann man die Spaltenergebnisse als Variablen verwenden.

Es erscheint nur sinnvoll diese LoopQuery zu benutzen, um die Ausführung der Transformation zu unterdrücken (if).

Ein Beispiel um die Loop-Query als IF-Query zu verwenden:

SELECT DISTINCT 1
  FROM <source-table>
 WHERE <last-change-date> >= <today>-7

Man bekommt eine Zeile, wenn sich seit 7 Tagen etwas geändert hat ansonsten keine. Somit wird die Haupt-Query ein Mal oder kein Mal ausgeführt.

In der Haupt-Query kann man die Spaltennamen der Loop-Query als Variablen verwenden. Es ist jedoch zu beachten, dass die Variablen jeweils als Text (String) eingefügt werden.

Siehe hierzu Beispiele beim Insert Modul.

Technische Spalten

Man kann technische Spalten definieren, die das Verhalten vom History-Modul beeinflussen:

Name Wert Bedeutung Beschreibung
valid_from_dt RC:valid_from_dt Periode gültig ab Wird beim Einfügen einer Periode auf den aktuellen Zeitpunkt current_time gesetzt
invalid_from_dt RC:invalid_from_dt Periode gültig bis (exklusiv) Wird beim Einfügen einer neuen Periode auf den Wert von end_of_time gesetzt. Beim Beenden einer Periode auf den aktuellen Zeitpunkt current_time
current_time ${string_to_datetime(module_utc_start_datetime)} Dieser Wert definiert den aktuellen Zeitpunkt Im Auslieferungszustand der Zeitpunkt des Starts des Moduls in date-time (ohne Millisekunden)
end_of_time ${string_to_datetime('9999-12-31 00:00:00')} Der Wert wird für das Ende der letzten offenen Periode verwendet Im Auslieferungszustand ist es der 31.12.9999
is_current_and_active OC:is_current_and_active Spaltenname für die aktuelle und aktive Periode Wenn gesetzt und in der Zieltabelle verfügbar, wird die Periode, die aktuell und auch aktiv ist, auf aktiv sonst auf inaktiv gesetzt
is_current_and_active_true Y Aktiv Wert, mit dem die Spalte is_current_and_active als aktiv markiert werden soll
is_current_and_active_false N Inaktiv Wert, mit dem die Spalte is_current_and_active als inaktiv markiert werden soll
is_latest_period OC:is_latest_period Spaltenname für die neuste Periode Wenn gesetzt und in der Zieltabelle verfügbar, wird die Periode, die aktuell (egal ob aktiv oder deleted) ist, auf aktiv sonst auf inaktiv gesetzt
is_latest_period_true Y Aktiv Wert, mit dem die Spalte is_latest_period als aktiv markiert werden soll
is_latest_period_false N Inaktiv Wert, mit dem die Spalte is_latest_period als inaktiv markiert werden soll
is_deleted OC:is_deleted Spaltenname für das Löschkennzeichen Wenn die Spalte in der Zieltabelle verfügbar ist, dann wir das Flag auf Inaktiv gesetzt, wenn die die Periode gelöschter Zeitraum ist. Ansonsten auf aktiv
is_deleted_true Y Aktiv Wert, mit dem die Spalte is_deleted als aktiv markiert werden soll
is_deleted_false N Inaktiv Wert, mit dem die Spalte is_deleted als inaktiv markiert werden soll
ins_by OC:ins_by Eingefügt von Wird bei einer Änderung nicht verändert. Beim Einfügen einer Zeile auf den aktuellen Änderer current_by gesetzt
upd_by OC:upd_by Geändert von Wird mit dem aktuellen Änderer current_by befüllt
last_changed_dt OC:last_changed_dt Geändert am Wird mit dem aktuellen Zeitpunkt current_time befüllt
current_by ${request_id} Dieser Wert definiert den aktuellen Änderer Im Auslieferungszustand die Request ID der datasqill Action Ausführung

Die verwendeten Spaltennamen (unter Wert) kann man an seine Umgebung anpassen. Siehe auch hierzu das Einstellen von Modul-Attributen im Anhang.

Enthät die Zieltabelle einige oder mehrere dieser technischen Spalten, so werden sie entsprechend der obigen Tabelle gefüllt.