Datenbankaktionen: Szenarien
Altova Website: MapForce-Videodemos
In diesem Kapitel werden einige der möglichen Szenarien für die Verwendung von Datenbankaktionen erläutert. In allen Szenarien wird eine hierarchische Datenbank namens BookCatalog.sqlite verwendet. Diese Datenbank hat drei Tabellen: Authors (Parent), Books (Child), TrackingInfo (mit keiner anderen Tabelle verbunden). Die Tabellen Authors und Books weisen eine Sekundärschlüsselbeziehung auf. Beachten Sie, dass für die Primärschlüssel in den Tabellen Authors und Books eine Autoinkrementierung festgelegt wurde. Die Struktur der Datenbank ist im nachstehenden Script beschrieben:
CREATE TABLE
"main"."Authors" (
"AuthorID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"Author" TEXT,
"Country" TEXT,
"Website" TEXT
);
CREATE TABLE
"main"."Books" (
"BookID" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"Title" TEXT,
"AuthorID" INTEGER,
"ISBN" TEXT,
"Publisher" TEXT,
"NumPages" INTEGER,
"Year" INTEGER,
"Genre" TEXT,
"Price" DECIMAL,
FOREIGN KEY ("AuthorID") REFERENCES "Authors" ("AuthorID") ON DELETE CASCADE ON UPDATE NO ACTION
);
CREATE TABLE
"main"."TrackingInfo" (
"MappedOn" DATETIME
);
Szenario 1: Löschen aller Datenbankdaten und Einfügen aller Quelldaten
Im ersten Szenario sollen alle Daten aus der Datenbank BookCatalog.sqlite gelöscht werden und die Datenbank soll mit allen Daten aus der Quelldatei befüllt werden. Unser Mapping sieht folgendermaßen aus:
Zwar hat die Datenbank drei Tabellen, doch wurden nur die Tabellen Authors und Books in die Datenbankkomponente inkludiert. Da auf die Tabelle TrackingInfo nichts gemappt wurde, fehlt die Tabelle in der Komponente. Da für die Tabellen Authors und Books eine Autoinkrementierung definiert wurde, müssen wir keine Verbindung zu den Spalten AuthorID und BookID ziehen: Diese IDs werden automatisch von der Datenbank generiert.
Datenbankaktionen für Authors
Die Tabellenaktionen für die Tabelle Authors (Abbildung unten) wurden folgendermaßen konfiguriert:
•Im Abschnitt Vor dem ersten Datensatz auszuführende SQL-Anweisung haben wir die DELETE-Aktion konfiguriert. Damit werden alle Datensätze einschließlich aller Child-Datensätze aus der Datenbank gelöscht.
•Im Abschnitt Für jeden Datensatz auszuführende Aktionen haben wir die Aktion Alles einfügen eingerichtet.
•Die Autoren-IDs werden von der Datenbank automatisch generiert (die Option DB-generiert in der Aktion Alles einfügen).
•Die anderen Werte werden aus der Quelldatei gemappt.
Datenbankaktionen für Books
Für die Tabelle Books haben wir dieselbe Alles einfügen-Aktion eingerichtet (Abbildung unten). Die Buch-IDs werden von der Datenbank generiert. Die Spalte AuthorID referenziert den Primärschlüssel in der Tabelle Authors. Die Werte für diese Spalte werden automatisch bereitgestellt. Alle anderen Werte werden aus der Quelldatei gemappt.
Ausgabe
Im Codefragment unten sehen Sie einen Auszug aus der Ausgabe:
DELETE FROM "Books"
DELETE FROM "Authors"
INSERT INTO "Authors" ("Author", "Country", "Website") VALUES ('Stephen King', 'US', 'www.stephenking.com')
SELECT "AuthorID" FROM "Authors" WHERE "AuthorID" = last_insert_rowid()
-- >>> %AuthorID1%
INSERT INTO "Books" ("AuthorID", "Title", "ISBN", "Publisher", "NumPages", "Year", "Genre", "Price") VALUES ('%AuthorID1%', 'Misery', '1501143107', 'Scribner', 368, 2016, 'Horror', 11.99)
INSERT INTO "Books" ("AuthorID", "Title", "ISBN", "Publisher", "NumPages", "Year", "Genre", "Price") VALUES ('%AuthorID1%', 'Outsider', '1501180983', 'Scribner', 576, 2018, 'Horror', 12.79)
Beachten Sie, dass die SQL-Anweisungen in der Ausgabe nur zu Informationszwecken dienen. Um die SQL-Abfragen auszuführen, öffnen Sie das Ausgabefenster und rufen Sie den Symbolleisten-Befehl SQL/NoSQL-Script ausführen auf. Nähere Informationen dazu finden Sie unter SQL-Anweisungen in der Ausgabe.
Szenario 2: Aktualisieren von Authors und Books, Rest einfügen und Tracking-Info einfügen
In realen Anwendungsszenarien ändert sich die Datenbank ständig und manchmal arbeiten mehrere Personen an derselben Datenbank. Es ist daher nicht ratsam, alle Datenbankdatensätze zu löschen. Im zweiten Szenario möchten wir Folgendes erreichen:
•Autoren und ihre Bücher, die sowohl in der Quelldatei als auch in der Datenbank vorhanden sind, sollen aktualisiert werden.
•Quelldatensätze, die in der Datenbank fehlen, sollen eingefügt werden.
•Es sollen Tracking-Informationen über das Datum und die Uhrzeit des Mappings bereitgestellt werden.
Unser Mapping hat dieselben Komponenten und Verbindungen wie im ersten Szenario. Die Datenbankaktionen wurden jedoch anders konfiguriert (siehe unten).
Datenbankaktionen für Authors
In der Abbildung unten sehen Sie die Aktionen, die für die Tabelle Authors definiert wurden. In der Aktualisieren, wenn...-Bedingung haben wir für die Spalte Author den Wert gleich definiert. Das heißt, nur wenn in der Quellkomponente Autoren vorhanden sind, die denselben Namen haben wir die in der Datenbank, werden diese Autorendatensätze in der Datenbank aktualisiert. Autoren die nur in der Quelldatei vorhanden sind, werden einfach in die Datenbank eingefügt. Autoren, die nur in der Datenbank vorhanden sind, bleiben unverändert.
Datenbankaktionen für Books
Dieselbe Kombination von Aktionen haben wir für die Tabelle Books (siehe unten). Diesmal wurde für die Spalte Title der Wert "gleich" definiert. Das heißt, wenn in der Quellkomponente und der Datenbank dieselben Bücher vorhanden sind, werden diese Buchdatensätze in der Datenbank aktualisiert. Bücher, die nur in der Quelldatei vorhanden sind, werden in die Datenbank eingefügt. Bücher, die nur in der Datenbank vorhanden sind, bleiben unverändert.
Keine doppelten Datensätze
Der Hauptvorteil der Aktualisieren, wenn...-Bedingung ist, dass dadurch keine Duplikate in der Datenbank erzeugt werden.
Ausgabe
Im Codefragment unten sehen Sie einen Auszug aus der Ausgabe:
UPDATE "Authors" SET "Country" = 'US', "Website" = 'www.stephenking.com' WHERE ("Authors"."Author" = 'Stephen King')
SELECT "AuthorID" FROM "Authors" WHERE ("Author" = 'Stephen King')
-- >>> %AuthorID1%
UPDATE "Books" SET "ISBN" = '1501143107', "Publisher" = 'Scribner', "NumPages" = 368, "Year" = 2016, "Genre" = 'Horror', "Price" = 11.99 WHERE ("Books"."AuthorID" = '%AuthorID1%') AND ("Books"."Title" = 'Misery')
UPDATE "Books" SET "ISBN" = '1501180983', "Publisher" = 'Scribner', "NumPages" = 576, "Year" = 2018, "Genre" = 'Horror', "Price" = 12.79 WHERE ("Books"."AuthorID" = '%AuthorID1%') AND ("Books"."Title" = 'Outsider')
Alternative Lösung
Damit in der Tabelle Books keine Duplikate erzeugt werden, können Sie auch die Child-Datensätze löschen (siehe unten) und in der Tabelle Books die Alles einfügen-Bedingung definieren. Die Aktionen für die Tabelle Authors bleiben unverändert. In dieser Konfiguration werden alle Book-Datensätze, deren Autoren sowohl in der Quellkomponente als auch in der Datenbank vorhanden sind, aus der Datenbank gelöscht. Wenn in der Tabelle Books die Bedingung Alles einfügen definiert ist, werden die folgenden Arten von Book-Datensätzen aus der Quelldatei eingefügt:
•Book-Datensätze, deren Autoren in der Quelldatei und in der Datenbank vorhanden sind.
•Book-Datensätze von neuen Autoren, die nur in der Quelldatei vorhanden sind.
Wenn es einen Book-Quelldatensatz ohne einen Parent gibt, wird dieser Book-Datensatz ebenfalls auf die Datenbank gemappt und sein Parent-Datensatz wird in der Tabelle Authors erstellt. Der neue Author-Datensatz erhält eine neue ID (Primärschlüssel) und alle anderen Felder erhalten NULL-Werte. Dies ist nur dann möglich, wenn alle Felder in der Tabelle Authors mit Ausnahme des Primärschlüssels auf Null gesetzt werden können. Wenn die Felder nicht den Wert Null erhalten dürfen, erhalten Sie eine Fehlermeldung, dass der NICHT NULL-Constraint fehlgeschlagen ist.
Beachten Sie, dass das Hauptszenario ein anderes Ergebnis als das Alternativszenario haben kann. Wenn ein Autor in der Datenbank z.B. fünf Buchdatensätze hat und derselbe Autor in der Quellkomponente nur drei Datensätze hat, werden alle fünf Datenbankdatensätze gelöscht und durch die drei Datensätze aus der Quellkomponente ersetzt.
Tracking-Info einfügen
Wenn mehrere Personen an derselben Datenbank arbeiten, ist es eventuell ratsam, zu wissen, wann das Mapping das letzte Mal ausgeführt wurde. Es gibt verschiedene Möglichkeiten, z.B. können Sie verschiedene datetime-Funktionen verwenden; Sie können im Dialogfeld Datenbankaktionen auch eine benutzerdefinierte SQL-Anweisung bereitstellen. In unserem Beispiel fügen wir die folgende SQL-Anweisung zum Abschnitt Für jeden Datensatz auszuführende Aktionen hinzu (TabelleAuthors):
INSERT INTO TrackingInfo VALUES (DATETIME())
Wenn Sie das SQL-Script ausführen, wird zuerst diese SQL-Anweisung ausgeführt, bevor irgendwelche Anweisungen für Datenbankdatensätze ausgeführt werden.
Andere mögliche Szenarien
Anstelle der Aktualisieren, wenn..-Bedingung können Sie auch die Löschen, wenn-Aktion definieren. In diesem Fall werden die Datensätze Author und Book, die sowohl in der Quellkomponente als auch in der Datenbank vorhanden sind, gelöscht und es werden neue Datensätze in die Datenbank eingefügt (Rest einfügen-Aktion). Sie können auch die Option wählen, dass dieselben Datensätze ignoriert werden (Ignorieren, wenn...-Bedingung) und neue Datensätze in die Datenbank eingefügt werden (Rest einfügen-Aktion).