SQL Server Object Explorer im VS 2012 gegen „alte Leiden“

Manchmal entdeckt man im VS Dinge, die man dort eigentlich nicht vermutet hätte. Neulich wollte ich eine SQL-Server-Datenbank von einem System auf das andere klonen. Dabei halfen mir die neuen Funktionen im VS 2012 ungemein.

Vorbemerkungen

Bei vielen Artikeln weiß ich immer gar nicht so genau, wie ich dem geneigten Leser klar machen soll, was eigentlich der Sinn des Geschriebenen ist. So ist es auch dieses Mal. Ich denke, es ist daher am effektivsten, wenn ich kurz umreiße, was ich zunächst tun wollte.

Ich habe eine SQL-Server-Datenbank auf System A. Im Rahmen meines Projektes brauche ich nun die Struktur dieser Datenbank auf einem anderen System B. Mein erster Instinkt war es, im Management Studio einfach ein DDL-Skript der kompletten Datenbank zu erstellen. Groß war nun meine Enttäuschung, als ich entdeckte, dass das gar nicht geht. Man kann zwar von allen Einzel-Objekten das DDL rausholen, nicht aber von einer Datenbank.

„Kein Problem“, dachte ich und versuchte, die Datenbank einfach direkt von A auf B zu importieren, aber auch das gelang nicht, weil A ein SQL Server 2008 Standard ist und B ein SQL Server 2008 Express. Hmmm, was nun?

Webcast

Für die eiligen Zeitgenossen, wie inzwischen fast Usus bei codingfreaks, hier der Webcast zum Thema:

Ab ins Studio!

Wenn gar nichts mehr geht, begibt sich der gestandene codingfreak sofort ins Visual Studio. So auch in diesem Fall. Das 2012-Studio bietet ein neues Tool-Fenster namens „SQL Server Object Explorer“. Dieses erlaubt es uns, wie beim immer noch vorhandenen Server-Explorer, verschiedene SQL Server Datenbanken direkt im Visual Studio zu bearbeiten.

Abb. 1: SQL Server Object Explorer

Wie in Abb. 1 zu erkennen ist, ist immer schon eine spezielle Version einer SQL Server Datenbank, die sog. localdb, im VS eingehängt. Dies hat vor allem Vorteile für Code-First-Programmierungen, die derzeit irgendwie schwer in sind. Aber weiter!

Ein Klick auf das Symbol mit dem Server und dem „+“ in der Tool-Leiste öffnet direkt den Verbindungs-Dialog des Management Studio-. Hier authentifiziert man sich nun einfach an der gewünschten Zieldatenbank und der Object Explorer übernimmt bei Erfolg die Datenbank. Abb. 2 zeigt den Object Explorer nachdem ich mich zu 2 Servern verbunden habe („mars“ ist ein SQL 2008 R2 und „thor“ ein SQL 2012):

Abb. 2: 2 neue Server im Object Explorer

Im Folgenden soll nun das Ziel sein, die Datenbankstruktur der „AdventureWorks2008R2“ vom Server mars auf den Server „thor“ zu bewegen.

Vorbereitungen

Das erste, was ich tue, ist, eine leere Zieldatenbank auf dem Server „thor“ zu erstellen. Der Übersicht halber nenne ich sie genau so, wie auf dem Quellsystem, was aber nicht notwendig wäre. Für diese Operation benötige ich gar kein Management Studio mehr, weil der Object Explorer ein vollwertiger Ersatz ist:

Abb. 3: Rechtsklick auf einen der Server
Abb. 4: Datenbank benennen

Wir hätten dies auch unterlassen und das „CREATE DATABASE“ später durchführen können, aber dazu müsste ich ein paar mehr Einstellungen vornehmen, die ich mir i.S.d. Übersicht spare.

Database-Projekte

Klicke ich nun mit der rechten Maustaste auf meine Quelldatenbank, erhalte ich im Kontextmenu die Option „Create New Project…“. Ein Klick darauf öffnet den folgenden Dialog:

Abb. 5: Create New Project-Dialog

Ich habe nur den Projektnamen geändert und angehakt, dass ein neuer Ordner für die Solution angelegt werden soll. Ein Klick auf „Start“ lässt den Rechner dann kurz die Infos zusammen sammeln. Der Fortschritt wird in einem eigenen Dialog gezeigt:

Abb. 6: Import-Fortschritt

Das Ergebnis dieser Operation ist, dass die gesamte Datenbank quasi im DDL-Code im Visual Studio vorliegt. Nebenbei sei hier nur der Hinweis erlaubt, dass man auch Änderungen an den Objekten vornehmen kann und somit nun endlich auch der Prozess der DB-Entwicklung im VS und damit auch im TFS erfolgen kann. Das bietet völlig neue Möglichkeiten für Themen, wie Versionierung, Synchronisation zwischen DB und Code usw. Aber das, wie gesagt, nur nebenbei.

Schema-Compare

So richtig gut gelungen finde ich die Option Schema-Compare, die man bei Rechtsklick auf das Projekt im VS erhält. Sie öffnet einen einen Editor, der so ähnlich zu verstehen ist, wie File-Syncing-Tools. D.h., dass auf der linken Seite jeweils die Quelle liegt und rechts das Vergleichsziel. Beides sind ganz einfach SQL Server Datenbanken. In Abb. 7 sieht man nun, dass ich links einfach mein Projekt einsetze und rechts eine frei wählbare Datenbank:

Abb. 7: Schema Compare einrichten

Jetzt wird auch klar, warum ich vorhin unbedingt eine leere Datenbank auf dem Ziel einrichten wollte. Das macht den Schema-Compare wesentlich einfacher und erfordert halt nicht viel Aufwand. Etwas unglücklich gelöst ist, dass man bei der Datenbankauswahl für die rechte Seite keine der im Object Explorer bereits angegebenen Connections verwenden kann. Stattdessen muss man wie in der vom Server Explorer gewohnten Weise eine neue anlegen, was einem aber in der Dropdown-Box direkt angeboten wird.

Klicke ich nun auf „Compare“, startet der Vergleich und das Ergebnis ist nach ein parr Sekunden Folgendes:

Abb. 8: Ergebnis des Schema-Compare

Zunächst einmal listet das Tool alle gefunden Objekte auf und ermittelt, für welche ggf. eine Operation notwendig wäre, um beide Datenbanken auf den gleichen Stand zu bringen. In unserem Beispiel ist es relativ logisch, dass nur links Objekte stehen, weil ja rechts noch nichts drin ist. Klickt man eine der Zeilen an, wird im unten sichtbaren Detailbereich bis auf DDL-Zeilenebene hinunter sauber aufgezeigt, was bei einer Sync-Operation genau geschehen würde. Ich würde mich nicht wundern, wenn hier das Merge-Tool des TFS Pate gestanden hätte. Absoluter Hammer und meines Wissens so im Datenbankumfeld noch nicht da gewesen.

Hoch damit

Am besten finde ich aber den kleinen unscheinbaren Button „Update“. Der macht nämlich genau das, was drauf steht. Klickt man ihn an, bekommt man noch die Möglichkeit eine „Ja-Nein-Sicherheitsabfrage“ zu beantworten und dann gehts in die Vollen:

Abb. 9: Schema-Update in Aktion

Das VS hat nach dem Schema-Compare letztlich eine Liste mit Änderungen (DDL) erzeugt und arbeitet diese nun ab. Das wird auch gleich so clever gemacht, dass typische Stolperstricke, wie z.B. User-Einrichtung, Reihenfolge der abhängigen Objekte usw. komplett eingehalten werden. Refresht man direkt nach dieser Aktion die Ansicht im Object Explorer, kann man sich von den Ergebnissen überzeugen:

Abb. 10: Updates sind angekommen

Noch nicht alles Gold

Ein paar Unzulänglichkeiten hat das Ganze doch noch, aber die fallen nicht wirklich ins Gewicht. So hakt der Import des Quell-Modells einer Datenbank bei komplexen Beziehungen zuweilen etwas. Meist hängt es einfach nur an der Benamung von Foreign-Key-Feldern. In solchen Fällen hilft ein einfacher Build des Datenbank-Projektes, bei dem dann, wie auch bei anderen Builds, Fehler generiert werden. Durch einen Doppelklick gelangt man dann zu der entsprechenden DDL-Stelle und kann mit Hilfe von IntelliSense den Bug beheben.

Etwas schwerer muten da die auftretenden Abstürze auf. Wenn man z.B. rechts auf eine Datenbank im Object Explorer klickt und dann „View Permissions“ anklickt, bekommt man das VS ziemlich zuverlässig zum Absturz.

Ich denke, dass all dies spätestens mit dem nächsten SP oder der nächsten Version des VS behoben sein wird.

Resumé

Besitzer der entsprechenden VS-Editionen sollten sich schnell mit den mächtigen Möglichkeiten dieser relativ neuen Welt auseinander setzen. Die Datenbankprojekte können neben den hier gezeigten Funktionen weitaus mehr leisten. Im Grunde braucht man kein Management Studio mehr, um sauber Datenbanken zu entwickeln. Wer die Möglichkeit hat, sollte statt Code-First-Zaubereien im professionellen Umfeld lieber mal hier rein schauen. Nur meine Meinung :-).

Edit

Für alle, die auf dem TFS arbeiten hier noch eine Ergänzung: Damit die Build-Prozesse auf dem Server bei Konfigurationen, wie z.B. Gated Checkin normal weiter laufen, sollte man in den Konfigurationseinstellungen der Solution bei den Datenbankprojekten jeweils die Haken bei „Build“ und „Deploy“ entfernen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.