2009-08-16 10 views
1

Ich arbeite an einer bereits vorhandenen MS SQL Server-Datenbank, die nicht sehr gut entworfen wurde. In den meisten Fällen fehlten Indizes und Primärschlüssel. Es gab KEINE Fremdschlüsseleinschränkungen.SQL Server Schema Syncronization

Ich habe eine lokale Kopie der DB (um nicht auf der Live-Version zu arbeiten), und behoben die meisten Probleme. Ich möchte jetzt meine Änderungen an den Produktionsserver synchronisieren,

aber ...

Da es keine vorherigen Fremdschlüssel-Constraints gab es sind Schlüssel Mismatches in den Tabellen, Tausende von ihnen. Ich habe ein paar Synchronisations-Tools ausprobiert, aber keines von ihnen erlaubt FK-Mismatches zu ignorieren oder aufzulösen. (In SQL Server Management Studio heißt es "Vorhandene Daten bei der Erstellung prüfen oder erneut aktivieren: Nein")

Gibt es eine Möglichkeit, die Diskrepanzen der alten Datenbank automatisch aufzulösen?

Antwort

0

Was meinst du mit "auto-resolve"? Vorhandene Daten sind "schlecht" - das heißt, die Einschränkungen, die Sie durchsetzen möchten, werden verletzt. Es gibt keine Möglichkeit, Ihre Daten "gut" zu machen, ohne sie zu verändern. Und es gibt natürlich keine Möglichkeit, automatisch zu entscheiden, wie die Daten repariert werden sollen.

Also, das Beste, was Sie tun können, ist die Daten zu analysieren, herauszufinden, wie Sie es korrigieren, die Korrekturen manuell vornehmen und dann die Einschränkungen hinzufügen. Sie könnten auch alle inkonsistenten Zeilen löschen (wahrscheinlich eine schlechte Idee, wenn Sie die Daten benötigen), oder den Server zwingen, die Einschränkungen für vorhandene Daten zu ignorieren (definitiv eine schlechte Idee).

Wenn Sie die inkonsistente Daten nur löschen wollen, würde ich vorschlagen, Sie zu schreiben (oder erzeugen, wenn es sind viele foreing Schlüssel) SQL-Skripte wie folgt aus:

DELETE a FROM a LEFT JOIN b ON a.b_id = b.id WHERE b.id IS NULL 

ALTER TABLE a ADD CONSTRAINT FK_a_b_id FOREIGN KEY (b_id) REFERENCES b (id) 
+0

davon aus, dass ich geschaffen habe, die FK-Einschränkungen als ich sollte nicht unmöglich sein, inkonsistente Daten automatisch zu löschen. –

+0

SQL Server kann dies nicht für Sie tun. Wahrscheinlich kann ein Drittanbieter-Tool, obwohl ich bezweifle, ob jemand darauf geachtet hat, dies zu implementieren. Persönlich finde ich, dass dies ein recht seltener Anwendungsfall ist, und es ist ziemlich einfach, mit einfachem SQL zu erreichen. Bitte beachten Sie die Bearbeitung meiner Antwort für ein Codebeispiel. – VladV

Verwandte Themen