Wir haben derzeit mehrere Datenbanken, möchten diese jedoch kombinieren und stattdessen unsere Domänenkontexte mithilfe von Schemas trennen.
Wie kann ich in MS SQL Server 2008 R2 den gesamten Inhalt eines Schemas in großen Mengen in ein anderes verschieben?
Beispielsweise werden alle Tabellen, Ansichten, Prozeduren, Indizes usw., die wir im dbo
Schema erstellt haben, jetzt im foo
Schema gespeichert.
EDIT: Ich wollte anhand der großartigen Kommentare von AaronBertrand klarstellen. Dies ist keine Mandantenfähigkeitssituation. In unserer Situation wurden Plugins für interne Tools isoliert von Entwicklern entwickelt, die ihre Tabellen nicht in der Datenbank des Tools zusammengeführt haben.
sql-server-2008-r2
schema
Matthew
quelle
quelle
Antworten:
Das Grundkonzept ist eigentlich recht einfach: Sie generieren ein Skript aus
sys.objects
undsys.schemas
erstellenALTER SCHEMA TRANSFER
Anweisungen. Sie haben beispielsweise drei Objekte imdbo
Schema und möchten alle in dasblat
Schema verschieben:Der folgende Code:
Wird dieses Skript ergeben (aber vielleicht nicht in dieser Reihenfolge):
(Möglicherweise möchten Sie zusätzliche Filter hinzufügen, um Objekte im
dbo
Schema wegzulassen, die Sie nicht verschieben möchten, bestimmte Objekttypen weglassen (z. B. sind alle Ihre Funktionen Dienstprogrammfunktionen und müssen nicht verschoben werden) Skript sortiert nach Objekttyp usw.)Es gibt jedoch einige Probleme beim Verschieben aller Ihrer Objekte in ein neues Schema:
Wahrscheinlich verweist Ihr Code immer noch auf diese Objekte als
dbo.object
- es gibt keine einfache Möglichkeit, dies zu beheben, außer Brute Force. Sie können sich wahrscheinlich alle Vorkommen von findendbo.
ziemlich leicht, aber diese können auch falsch positive Ergebnisse , wie zurückkehrenEXEC dbo.sp_executesql
,dbo.
in den Kommentaren, true Verweise auf Objekte , die in dem bleibendbo.
Schema usw.Ihre Abhängigkeiten werden wahrscheinlich völlig aus dem Ruder laufen, aber ich habe dies nicht gründlich getestet. Ich weiß das in diesem Szenario:
Die Fremdschlüssel migrieren tatsächlich reibungsloser als erwartet (mit der Einschränkung, dass ich sie auf einer viel neueren Version als Sie teste). Aber weil der Code
blat.pX
immer noch verweistdbo.bar
, wird die Prozedur offensichtlich ausgeführt:Wird diesen Fehler ergeben:
Und Abhängigkeitsabfragen wie:
Wird diesen Fehler ergeben:
Und die Ansicht abfragen:
Ergibt diese Fehler:
Dies könnte also eine Menge Aufräumarbeiten beinhalten. Nachdem Sie alle Objektreferenzen korrigiert haben, möchten Sie wahrscheinlich alle Module neu kompilieren und alle Ansichten im neuen Schema aktualisieren. Sie können dafür ein Skript generieren, das dem obigen Beispiel sehr ähnlich ist.
quelle