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 |
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.
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.
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.
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 |
Bei der Installation des Modules kann man weitere Attribute einstellen
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.
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.