Transfer

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

Beschreibung

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.

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. 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

Löschen vor dem Einfügen

Um vor dem Beschreiben die Tabelle komplett oder partiell zu leeren gibt es unterschiedliche Attribute. Diese kann man optional bei der Installation anschalten

Truncate Before

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.

Delete Before

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:

  • Wenn Source Condition aktiviert ist, dann wird in Delete Condition ein Select Statement erwartet, welches in der Quelldatenbank ausgeführt werden kann. Alle gefundenen Rows werden dann aus der Zieltabelle gelöscht. Das Löschen erfolgt also per Java Zeile für Zeile
  • Wenn Delete Condition leer ist, dann wird das gleiche Verfahren wie beim Truncate Before verwendet
  • Ansonsten wird aus der Zieldatenbank gelöscht und in Delete Condition wird eine Ergänzung zum DELETE-Statement erwartet. Das Schlüsselwort WHERE muss mit angegeben werden. Das Löschen erfolgt also für alle zu löschenden Daten mit einem Befehl Die Delete Condition wird derzeit nicht validiert!

Loop Query

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

Validate main query

Wenn aktiviert, wird die Hauptabfrage nicht validiert

Source database ID

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 und Write Size

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.

Beispiele

Übertragen von Daten 1:1 von einer Quell- in eine Zieldatenbank

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: copy_one_to_one Jetzt kann man mit dieser Transformation regemäßig die Daten kopieren.