Extrahieren von Zeilen aus einer Datenbank inklusive depedent Zeilen
Ich würde gerne zum generieren von insert-strings für eine Zeile in meiner Oracle-Datenbank, einschließlich alle Ihre abhängigen Zeilen in anderen Tabellen (und Ihre abhängigen Zeilen).
Beispiel:
CREATE TABLE a (
a_id number PRIMARY KEY,
name varchar2(100)
);
CREATE TABLE b (
b_id number PRIMARY KEY,
a_id number REFERENCES a(a_id)
);
Wenn ich entpacken Sie die Zeile aus a mit der a_id = 1, sollte das Ergebnis einer insert-string für Sie, dass Zeilen-und abhängigen Zeilen:
INSERT INTO a(a_id, name) VALUES (1, 'foo');
INSERT INTO b(b_id, a_id) VALUES (1, 1);
INSERT INTO b(b_id, a_id) VALUES (2, 1);
INSERT INTO b(b_id, a_id) VALUES (3, 1);
Der Grund, warum ich dies tun wollen, ist, dass ich große Datenbank mit vielen verschiedenen Tabellen und constraints zwischen dann und das würde ich gerne extrahieren, die einen kleinen Teil der Daten als test-Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möglicherweise gibt es einige Tools, die tut es schon, aber willkürlich die Extraktion aller Zeilen von Tabellen aus einem Tisch ist eine kleine Entwicklungsaufgabe in sich selbst. Ich kann nicht schreiben, die ganze Sache für dich, aber ich kann dir begann - ich begann, es zu schreiben, aber nach etwa 20 Minuten merkte ich, dass es war ein wenig mehr Arbeit, die ich wollte, zu verpflichten, sich an unbezahlten Antwort.
Ich kann sehen, dass es stets am besten durch eine rekursive PL/SQL-Prozedur, verwenden würde dbms_ouput und user_cons_columns & user_constraints zu erstellen, fügt Anweisung für die Quell-Tabelle. Sie können ein wenig schummeln, indem alle die Einsätze, wenn die Spalten wurden char-Werte, da Oracle wird implizit konvertiert alle char-Werte auf den richtigen Datentyp, vorausgesetzt, Ihr NLS-Parameter sind identisch in der Quelle & target-system.
Beachten Sie, dass das Paket unten Probleme haben wird, wenn Sie zirkuläre Beziehungen in Ihrem Tische; auch auf früheren Versionen von Oracle können Sie mit einer out-of-Pufferspeicher mit dbms_output. Beide Probleme können gelöst werden, durch einfügen der generierten sql in eine staging-Tabelle, die einen eindeutigen index auf dem sql -, und Abbruch der Rekursion, wenn man einen eindeutigen Schlüssel Kollision. Die große Zeitersparnis, unten ist die MakeParamList Funktion, konvertiert einen cursor zurückgibt, die eine Liste von Spalten in eine durch Kommas getrennte Liste, oder einen einzigen Ausdruck, Darstellung der Werte dieser Spalten in einer in Anführungszeichen eingeschlossenen, durch Komma abgetrennt, wenn Sie ausgeführt wird, wie der select-Klausel in einer Abfrage für die Tabelle.
Beachten Sie auch, dass das folgende Paket nicht wirklich arbeiten, bis Sie es ändern weitere (einer der Gründe, warum ich aufgehört, es zu schreiben): Die erste insert-Anweisung generiert wird, basiert auf der Annahme, dass die constraint_vals argument übergeben, wird das Ergebnis in einer einzigen Zeile erzeugt werden - natürlich, das ist fast sicher nicht der Fall, wenn Sie anfangen recursing (da haben Sie viele Kinder-Zeilen für ein Elternteil). Sie müssen ändern Sie die generation der ersten Aussage (und spätere rekursive Aufrufe) werden in einer Schleife behandeln die Fälle, in denen der Anruf zu der ersten IMMEDIATE EXECUTE-Aufruf erzeugt mehrere Zeilen statt einer einzigen. Die Grundlagen, um es arbeiten hier sind, brauchen Sie nur Schleifen, die details und Holen Sie sich die äußeren cursor arbeiten.
Einer abschließenden beachten Sie auch: Es ist unwahrscheinlich, dass Sie laufen konnte, dieses Verfahren generiert einen Satz von Zeilen, die, wenn Sie eingesetzt wird in einem Ziel-system, würde dies eine "saubere" Daten hat, da, obwohl die Sie erhalten würden, alle abhängigen Daten, diese Daten können abhängig von anderen Tabellen, die Sie nicht importieren (z.B., das erste Kind-Tabelle, die Sie stoßen können auch andere Fremdschlüssel verweisen auf die Tabellen keinen Bezug zu Ihrem ursprünglichen Tisch). In diesem Fall möchten Sie vielleicht starten Sie mit den detail-Tabellen und arbeiten Sie Ihren Weg nach oben statt nach unten; dadurch, dass Sie würde auch wollen, um in umgekehrter Reihenfolge zu den Anweisungen, die Sie erzeugt, entweder über eine scripting-Dienstprogramm oder durch einfügen von sql in eine staging-Tabelle wie ich oben erwähnt, mit einer Sequenz, und wählen Sie eine absteigende Sortierung.
Als für die Berufung auf Sie, übergeben Sie das Komma getrennte Liste der Spalten zu beschränken, als constraint_cols und die entsprechenden Komma-getrennte Liste von Werten als constraint_vals, z.B.:
Hier ist es:
Benutze ich nur plain old SQL, um diese Aufgaben ausführen - verwenden Sie die select-Anweisungen für die Generierung der inserts:
Ich denke, DBUnit kann dies tun.