3 Stimmen

Eine Tabelle mit einer anderen gleichsetzen, ohne sie zu löschen *

Ich weiß, dass dies ein bisschen seltsam ist, aber wenn jemand helfen könnte, wäre ich sehr dankbar.

Das Szenario ist, dass wir eine Produktionsdatenbank an einem entfernten Standort und eine Entwicklerdatenbank in unserem lokalen Büro haben. Die Entwickler nehmen Änderungen direkt an der Entwicklerdatenbank vor, und als Teil des Bereitstellungsprozesses wird eine C#-Anwendung ausgeführt, die eine Reihe von .sql-Skripten erzeugt, die wir auf der entfernten Seite ausführen können (im Wesentlichen delete *, insert), aber wir suchen nach etwas Aufwändigerem, da die Ausfallzeit durch das delete * inakzeptabel ist. Dies sind alles Referenzdaten, die Menüpunkte, Funktionen usw. einer großen Website steuern.

Ich habe eine Sproc, die im Wesentlichen eine Diff von zwei Tabellen zurückgibt. Mein Denken ist, dass ich alle erwarteten Daten in eine tmp-Tabelle einfügen kann, führen Sie die diff, und löschen Sie alles aus der Zieltabelle, die nicht in der Quelle und dann Upsert alles andere ist.

Die Frage ist, ob es eine einfache Möglichkeit gibt, dies zu tun, ohne einen Cursor zu verwenden? Zur Veranschaulichung gibt die Sproc einen Datensatz zurück, der wie folgt strukturiert ist:

Tabellenname Col1 Col2 Col3 Ziel Src

Alles im Recordset mit TableName = Dest sollte gelöscht werden (da es in src nicht existiert) und alles in Src sollte in dest eingefügt werden. Mir fällt kein Weg ein, dies rein setbasiert zu tun, aber meine DB-Kenntnisse sind schwach.

Für jede Hilfe wären wir dankbar. Bitte entschuldigen Sie, wenn die Erklärung unvollständig ist; lassen Sie es mich wissen, wenn Sie weitere Details benötigen.

0 Stimmen

Klingt wie ein Kandidat für die Verwendung von Sql-Server-Replikation?

0 Stimmen

Ich habe erst gestern eine ähnliche (aber nicht identische) Frage gestellt. Ich habe mich entschieden, Visual Studio 2010 Data Compare zu verwenden. stackoverflow.com/questions/3012544/

0 Stimmen

Ich habe keine Möglichkeit des Datenabgleichs und wir arbeiten auch noch mit SQL Server 2005 (also kein T-SQL MERGE). Eine Replikation würde auch nichts bringen, da wir nur in regelmäßigen Abständen deployen (manchmal einmal pro Woche, manchmal einmal im Monat) und die Produktionsdaten außerhalb dieser Zeiten unangetastet bleiben sollten.

1voto

Aaronaught Punkte 118136

Es gibt eine viel, viel einfachere Möglichkeit, dies zu tun, vorausgesetzt, Sie verwenden SQL Server 2008: Die MERGE Erklärung.

Die Migration aller Änderungen von einer Tabelle in eine andere ist so einfach wie:

MERGE DestinationTable d
USING SourceTable s
    ON d.Id = s.Id
WHEN MATCHED THEN UPDATE
    SET d.Col1 = s.Col1, d.Col2 = s.Col2, ...
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id, Col1, Col2, ...)
    VALUES (s.Id, s.Col1, s.Col2, ...)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Das war's. DestinationTable wird identisch sein mit SourceTable danach.

1voto

Nick Kavadias Punkte 7372

Nahm am tablediff

Die Tabellen müssen nicht an der Replikation teilnehmen, um das Dienstprogramm auszuführen. Es gibt einen wunderbaren -f-Schalter, um t-sql zu erzeugen und die Tabellen "synchron" zu machen:

Erzeugt ein Transact-SQL-Skript, um die Tabelle auf den Zielserver zu bringen Server in Konvergenz mit der Tabelle auf dem Quellserver zu bringen. Sie können optional einen Namen und Pfad für das generierte Transact-SQL-Skript Datei. Wenn file_name nicht angegeben wird, wird die in dem Verzeichnis erzeugt, in dem das Dienstprogramm läuft.

0voto

Decker97 Punkte 1633

Warum machen Sie nicht einfach ein Backup der Produktionsdatenbank und stellen es über Ihre Entwicklungsdatenbank wieder her? Sie sollten Änderungsskripte für alle ddl-Unterschiede aus der Produktionsdatenbank haben, die Sie nach der Wiederherstellung auf der Datenbank ausführen können, um den Einsatz in der Produktion zu testen.

bearbeiten: Sorry, gerade wieder gelesen Ihre Frage, es sieht aus wie Sie Ihre Konfiguration Informationen in Ihrer Entwicklung db speichern und Ihre Änderung Skripte aus, dass so dies nicht funktionieren würde.

Ich würde empfehlen, Änderungsskripte von Hand zu erstellen und sie in der Versionskontrolle zu speichern. Verwenden Sie dann sqlcmd oder osql und eine Batch-Datei, um Ihre Änderungsskripte in der Datenbank auszuführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X