Das Modul "Transfer between Databases" liest Daten mit Hilfe einer SQL-Abfrage aus verschiedenen Quelltabellen einer Quelldatenbank und schreibt sie in eine Zieltabelle in der Zieldatenbank. Die SQL-Abfrage wird vom datasqill Entwickler über die GUI definiert. Die verwendeten Datenobjekte bei der Abfrage müssen alle in derselben Datenbank liegen.
Name | Bedeutung |
---|---|
Modul | Transfer |
Modulklasse | DsModRemote |
Typ | Java |
Zweck | Übertragen der Daten zwischen 2 Datenbanken z.B. Staging |
Transformationscode | SQL Abfrage |
Quellen | Tabellen in der Quelldatenbank |
Ziele | Tabellen in der Datenbank |
Das Modul "Transfer between Databases" wird über eine SQL-Abfrage gesteuert, die der datasqill Entwickler definiert. Das Modul liest Daten mit Hilfe dieser Abfrage aus den Quelltabellen und schreibt sie in eine Zieltabelle. Im Gegensatz zu Modulen die innerhalb einer Datenbank operieren, werden in diesem Modul die Zeilen aus der Quelldatenbank gelesen und in die Zieldatenbank geschrieben.
Das folgende einfache Beispiel zeigt, wie man mit Hilfe des Moduls eine Daten transferiert werden. Zunächst die verwendete SQL-Abfrage:
SELECT c_custkey AS key
, c_name AS name
FROM staging.customer
Heißen das Zielschema "demo" und die Zieltabelle "d_customer", generiert das Modul für das Einfügen in die Zieldatenbank folgendes SQL:
INSERT INTO demo.d_customer (key, name) VALUES(?,?)
Wie im Beispiel zu erkennen, müssen die Spaltennamen der Zieltabelle als Aliase angegeben werden, wenn die Quellspalten anders heißen. Im Beispiel hat die Zieltabelle "d_customer" also die Spalten "key" und "name". Das gilt insbesondere dann, wenn man Literale oder Funktionen verwendet, um Spaltenwerte zu erzeugen wie in diesem Beispiel:
SELECT c_custkey AS key
, c_name AS name
, 'de' AS country
, CURRENT_DATE() AS createdate
FROM staging.customer
Datenquellen und Datenziele des Moduls sind Datenbanktabellen. Die Quellen und Ziele können in unterschiedlichen Dazenbanken liegen. Das Modul unterstützt mehrere Quelltabellen aber nur eine Zieltabelle.
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. 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.
Um vor dem Beschreiben die Tabelle komplett oder partiell zu leeren gibt es unterschiedliche Attribute. Diese kann man optional bei der Installation anschalten
Wenn das boolsche Attribut Truncate Before angeboten ist, dann sind die anderen Attribute zum Leeren der Tabelle unterdrückt. Ist dieses Attribut aktiviert, dann wird die Tabelle vorher komplett geleert. Wenn die Zieldatenbank eine Prozedur für TRUNCATE TABLE anbietet, wird diese verwendet. Ansonsten werden alle Zeilen mit dem DELETE Befehl gelöscht.
Wenn das boolesche Attribut Delete Before angeboten ist, dann wird auch noch die Textbox Delete Condition und das boolesche Attribut Source Condition verfügbar. Ist dieses Attribut aktiviert, dann wird nach unterschiedlichen Strategien gelöscht:
Hier kann ein Select Statement angegeben werden. Wenn das Attribut Execute loop query in source db aktiviert ist, dann wird die Query in der Quelldatenbank ausgeführt, ansonsten in der Zieldatenbank. Die Spalten, die von der Loop Query zurückkehren, können als Variablen in der Haupt-Query verwendet werden. Pro Zeile in der Loop Query wird die Haupt Query einmal
Wenn aktiviert, wird die Hauptabfrage nicht validiert
In Fällen, wie z.B. loop Query aus der Zieldatenbank (also Execute loop query in source db nicht aktiviert), muss angegeben werden, welche Datenbank für die Quellabfrage verwendet werden soll. Hierbei muss die Datenbank-ID angegeben werden
Fetch Size ist die Größe des Lesepuffers in Zeilen und Write Size die Größe des Schreibpuffers in Zeilen. Hier gilt es einen guten Kompromiss zwischen Datendurchsatz und Speicherbedarf zu finden. Bei Abfragen mit vielen und großen Spalten erhöht sich der Speicherbedarf und kann an die Grenze des verfügbaren Speichers gehen. Außerdem ist zu berücksichtigen, dass die (virtuelle) Maschine auf der datsqill läuft genügend Speicher hat; insbesondere dann, wenn viele Prozesse gleichzeitig dieses Modul verwenden.
Es sollen aus einer Quelldatenbank alle Daten von eine Tabelle in gleicher Struktur in die Zieldatenbank kopiert werden. Hierzu muss in der Zieldatenbank eine gleichartige Tabelle angelegt werde, soiw ein Mapping, welches den Kopiervorgang ausführt.
Angenommen es git in einer Postgres-Datenbank folgende Tabelle:
CREATE TABLE artikel (
artikel_nr character varying(30) NOT NULL
, bezeichnung character varying(60)
, preis numeric(14,2)
, PRIMARY KEY (artikel_nr)
);
Dieses Statement kann man einsehen, wenn man in datasqill ein Objekt anlegt, welches auf diese Tabelle zeigt und dann den Button "Show Table Create Script" betätigt.
In der Zieldatenbank (hier Exasol) wird eine Tabelle mit den gleichen Spalten angelegt:
CREATE TABLE artikel (
artikel_nr VARCHAR(30) UTF8 NOT NULL
, bezeichnung VARCHAR(60) UTF8
, preis DOUBLE
, PRIMARY KEY (artikel_nr)
);
Jetzt verbindet man im datasqill das Quellobject mit einer neuen Action und dieses mit einem neuen Objekt, welches man nun auf die Exsol Zieltabelle zeigen lässt (vorher einmal im Objekt die Datenbank refresehen). Aus dem "Show Table Create Script" kann man sich auch das Select-Statement kopieren:
SELECT artikel_nr
, bezeichnung
, preis
FROM softquadrat.artikel
Die Action sieht dann so aus: Jetzt kann man mit dieser Transformation regemäßig die Daten kopieren.