Exemplarische Vorgehensweise: Anwenden von Umgestaltungstechniken für eine Datenbank
Mithilfe der Umgestaltung in Visual Studio Premium oder Visual Studio Ultimate können Sie die Anzahl von sich wiederholenden und fehleranfälligen Aufgaben verringern, die zum Entwerfen und Aktualisieren eines Datenbankschemas ausgeführt werden müssen. So können Sie mittels Umgestaltung beispielsweise Verweise auf ein Datenbankobjekt aktualisieren, wenn dessen Name geändert oder das Objekt in ein anderes Schema verschoben werden muss. Durch diese Herangehensweise können Sie sowohl die Geschwindigkeit als auch die Genauigkeit bei routinemäßigen Änderungen am Datenbankentwurf erhöhen.
In dieser exemplarischen Vorgehensweise wird ein typisches Szenario der Datenbankentwicklung veranschaulicht. Wenn Sie einer vorhandenen Datenbank Funktionen hinzufügen möchten, müssen Sie die Erstimplementierung ausführen und diese anschließend mit einem anderen Teammitglied überprüfen. Während der Überprüfung werden mehrere Probleme identifiziert, die vor dem Einchecken der Änderungen behandelt werden müssen. Anschließend wird das Schema unter Verwendung verschiedenster Umgestaltungstechniken geändert.
In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben veranschaulicht:
Importieren des Datenbankschemas
Implementieren einer typischen Datenbankentwicklungsaufgabe
Korrigieren eines Codierungsfehlers
Abschließen der Entwicklungsaufgabe
Behandeln von Codeüberprüfungsfeedback
Vorbereitungsmaßnahmen
Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie Folgendes:
Visual Studio Premium oder Visual Studio Ultimate
Schreibgeschützter Zugriff auf einen Datenbankserver, auf dem die AdventureWorks2008-Datenbank installiert ist
Importieren des Datenbankschemas
Vor dem Ändern eines Schemas in einer Teamumgebung wird ein vorhandenes Projekt in der Regel zunächst aus dem Versionskontrollsystem ausgecheckt. In dieser exemplarischen Vorgehensweise erstellen Sie ein Datenbankprojekt und importieren das Schema aus der AdventureWorks2008-Beispieldatenbank.
So erstellen Sie ein Datenbankprojekt
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Das Dialogfeld Neues Projekt wird angezeigt.
Erweitern Sie unter Installierte Vorlagen den Knoten Datenbank, und klicken Sie dann auf den Knoten SQL Server.
Klicken Sie in der Liste der Vorlagen auf SQL Server 2008-Datenbankprojekt.
Geben Sie im Feld Name den Namen "RefactorAdventureWorks" ein, und klicken Sie auf OK.
Eine Lösung mit einem leeren Datenbankprojekt und dem Namen "RefactorAdventureWorks" wird als Testprojekt (auch: Sandkasten) erstellt.
Importieren Sie nun das Schema aus einer bereitgestellten Instanz der AdventureWorks-Datenbank.
So importieren Sie die AdventureWorks-Datenbank
Klicken Sie entweder im Projektmappen-Explorer oder in der Schemaansicht auf RefactorAdventureWorks.
Klicken Sie im Menü Projekt auf Datenbankobjekte und -einstellungen importieren.
Tipp
Sie können auch mit der rechten Maustaste auf RefactorAdventureWorks klicken und anschließend auf Datenbankobjekte und -einstellungen importieren klicken.
Der Datenbankimport-Assistent wird angezeigt.
Klicken Sie in der Liste Quelldatenbankverbindung auf die Verbindung für die AdventureWorks-Datenbank.
Wichtig
Wenn Sie noch keine Verbindung mit dieser Datenbank hergestellt haben, müssen Sie zunächst auf Neue Verbindung klicken, um eine Verbindung herzustellen. Weitere Informationen finden Sie unter Gewusst wie: Erstellen einer Datenbankverbindung.
Klicken Sie auf Start und anschließend auf Fertig stellen, wenn die Objekte und die Einstellungen importiert wurden.
Beim Importieren des Schemas werden Projektelemente, die Objekten in der Datenbank entsprechen, im Projektmappen-Explorer und in der Schemaansicht unter dem Datenbankprojekt angezeigt.
Tipp
Obwohl Sie zum Importieren des Schemas eine Verbindung mit der Datenbank hergestellt haben, wurde diese Verbindung jetzt getrennt, und Sie arbeiten offline.
Im nächsten Schritt wird eine für die Datenbankentwicklung typische Aufgabe (Hinzufügen von Code zum Datenbankprojekt) ausgeführt.
Implementieren einer typischen Datenbankentwicklungsaufgabe
Für diese Aufgabe wurden Sie gebeten, eine Unterstützung zur Nachverfolgung der Abwesenheit von Mitarbeitern zu implementieren. Im Rahmen dieser Aufgabe müssen die folgenden Objekte erstellt werden:
Eine Tabelle, in der das Anfangs- und Enddatum jeder Abwesenheit sowie die Art der Abwesenheit (Urlaub, Krankheit, Geschworenendienst, beweglicher Feiertag, unbezahlter Urlaub oder Trauerfall) verfolgt werden. Die Tabelle wird später in dieser exemplarischen Vorgehensweise dem Schema "Person" hinzugefügt. Für die Daten in der Tabelle gelten folgende Einschränkungen:
Eine Abwesenheit dauert maximal fünf Tage. (Längere Abwesenheitszeiten werden in mehrere Einträge unterteilt.)
Abwesenheiten besitzen gültige Datumsbereiche.
Die Tabelle ist über die EmployeeID mit der Tabelle "Employee" verknüpft.
Eine Ansicht mit der Komplettübersicht über den Abwesenheitsverlauf der einzelnen Mitarbeiter
Eine gespeicherte Prozedur zum Erfassen der Abwesenheit sowie zum Aktualisieren der Urlaubsstunden für den Mitarbeiter, sofern es sich bei der Abwesenheit um einen Urlaub handelt.
So bereiten Sie das Hinzufügen von Code vor
Klicken Sie im Menü Ansicht auf Schemaansicht der Datenbank.
Erweitern Sie in der Schemaansicht den Knoten RefactorAdventureWorks.
Wenn die Schemaansicht nach Objekttyp sortiert ist, klicken Sie auf der Symbolleiste auf Objektgruppierung ändern.
Tipp
Die Schemaansicht wird nach Objekttyp sortiert, wenn sie Knoten enthält, bei denen es sich um benannte Tabellen und Ansichten handelt. Wenn die Schemaansicht einen Knoten mit dem Namen "Schemas" enthält, können Sie mit der nächsten Prozedur fortfahren.
Im nächsten Schritt wird die Tabelle "AbsenceHistory" einem Datenbankprojekt hinzugefügt.
So fügen Sie die Tabelle "AbsenceHistory" hinzu
Erweitern Sie in der Schemaansicht den Knoten Schemas, erweitern Sie den Unterknoten Person, und erweitern Sie den Unterknoten Tabellen.
Klicken Sie mit der rechten Maustaste auf den Unterknoten Tabellen, zeigen Sie auf Hinzufügen, und klicken Sie auf Tabelle.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie im Feld Name den Namen AbsenceHistory ein, und klicken Sie auf Hinzufügen.
Der Transact-SQL-Editor wird mit der Definition der Tabelle "AbsenceHistory" geöffnet.
Ersetzen Sie im Transact-SQL-Editor die vorhandene Tabellendefinition durch den folgenden Code:
CREATE TABLE [Person].[AbsenceHistory] ( [EmployeeID] INT NOT NULL, [BeginDate] DateTime NOT NULL, [EndDate] DateTime NOT NULL, [AbsenceType] NCHAR(1) NOT NULL );
Klicken Sie im Menü Datei auf Person.AbsenceHistory.table.sql speichern.
Fügen Sie anschließend der Tabelle "AbsenceHistory" eine CHECK-Einschränkung hinzu.
So fügen Sie der Tabelle eine CHECK-Einschränkung hinzu
Erweitern Sie in der Schemaansicht den Knoten AbsenceHistory.
Klicken Sie mit der rechten Maustaste auf den Knoten Einschränkungen, zeigen Sie auf Hinzufügen, und klicken Sie auf CHECK-Einschränkung.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie unter Name den Namen CK_AbsenceHistory_ValidDates ein, und klicken Sie auf Hinzufügen.
Der Transact-SQL-Editor wird mit der Definition der Einschränkung geöffnet.
Ersetzen Sie im Transact-SQL-Editor die vorhandene Einschränkungsdefinition durch den folgenden Code:
ALTER TABLE [Person].[AbsenceHistory] ADD CONSTRAINT [CK_AbsenceHistory_ValidDates] CHECK (EndDate >= BeginDate AND DateDiff(day, EndDate, BeginDate) <= 5) go EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = 'Check constraint [EndDate]>= [BeginDate]', @level0type = N'SCHEMA', @level0name = N'Person', @level1type = N'TABLE', @level1name = N'AbsenceHistory', @level2type = N'CONSTRAINT', @level2name = N'CK_AbsenceHistory_ValidDates';
Mit diesem Code wird eine Einschränkung für die Tabelle definiert, um zu gewährleisten, dass das Enddatum nach dem Startdatum liegt und der Zeitraum zwischen den beiden Datumswerten maximal fünf Tage beträgt.
Klicken Sie im Menü Datei auf Person.AbsenceHistory.CK_AbsenceHistory_ValidDates.chkconst.sql speichern.
Im nächsten Schritt wird der Tabelle "AbsenceHistory" ein Fremdschlüssel hinzugefügt.
So fügen Sie die Fremdschlüsseldefinition hinzu
Klicken Sie in der Schemaansicht mit der rechten Maustaste auf den Knoten Schlüssel, zeigen Sie auf Hinzufügen, und klicken Sie auf Fremdschlüssel.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie unter Name den Namen FK_AbsenceHistory_Employee_EmployeeID ein, und klicken Sie auf Hinzufügen.
Der Transact-SQL-Editor wird mit der Definition des Fremdschlüssels geöffnet.
Ersetzen Sie im Transact-SQL-Editor die vorhandene Definition des Fremdschlüssels durch den folgenden Code:
ALTER TABLE [Person].[AbsenceHistory] ADD CONSTRAINT [FK_AbsenceHistory_Employee_EmployeeID] FOREIGN KEY ([EmployeeID]) REFERENCES [HumanResources].[Employee] ([BusinessEntityID]) ON DELETE NO ACTION ON UPDATE NO ACTION; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = 'Foreign key constraint referencing Employee.BusinessEntityID.', @level0type = N'SCHEMA', @level0name = N'Person', @level1type = N'TABLE', @level1name = N'AbsenceHistory', @level2type = N'CONSTRAINT', @level2name = N'FK_AbsenceHistory_Employee_EmployeeID';
Mit diesem Code wird eine Fremdschlüsselbeziehung zwischen der EmployeeID in der Tabelle "AbsenceHistory" und der BusinessEntityID in der Tabelle "[HumanResources].[Employee]" definiert.
Klicken Sie im Menü Datei auf Person.AbsenceHistory.FK_AbsenceHistory_Employee_EmployeeID.fkey.sql speichern.
An diesem Punkt stellen Sie fest, dass sich die Tabelle eigentlich im Schema "HumanResources" befinden muss. Dieser Fehler wird in der nächsten Prozedur korrigiert.
Korrigieren eines Codierungsfehlers
Da Sie bereits Einschränkungen und Fremdschlüssel definiert haben, ist das Verschieben einer Tabelle und der zugehörigen Objekte in ein anderes Schema üblicherweise sehr zeitaufwändig. Mithilfe der Datenbankumgestaltung können Sie die Tabelle und die zugehörigen Objekte schnell und einfach in das korrekte Schema verschieben, bevor Sie fortfahren.
So verschieben Sie die Tabelle "AbsenceHistory" in das Schema "HumanResources"
Klicken Sie in der Schemaansicht mit der rechten Maustaste auf die Tabelle "AbsenceHistory", zeigen Sie auf Umgestalten, und klicken Sie auf In Schema verschieben.
Das Dialogfeld zum Verschieben des Schemas wird angezeigt.
Klicken Sie in der Liste Neues Schema auf HumanResources.
Vergewissern Sie sich, dass das Kontrollkästchen Vorschau der Änderungen aktiviert ist, und klicken Sie auf OK.
Das Dialogfeld Vorschau der Änderungen wird angezeigt. Überprüfen Sie die Änderungen, bevor Sie sie für das Datenbankprojekt übernehmen.
Klicken Sie auf Übernehmen.
Die Umgestaltungsänderungen werden für das Datenbankprojekt übernommen. Die Tabelle "AbsenceHistory" wird zusammen mit allen zugehörigen Objekten aus dem Schema "Person" in das Schema "HumanResources" verschoben.
Erweitern Sie in der Schemaansicht den Schemaknoten HumanResources und anschließend den Knoten Tabellen.
Die Tabelle "AbsenceHistory" wird im richtigen Schema angezeigt.
Tipp
Beim Verschieben der Objekte in das korrekte Schema wurden die Namen der Dateien, in denen die Objekte definiert sind, nicht geändert. Wenn Sie die Dateinamen aktualisieren möchten, müssen Sie sie im Projektmappen-Explorer umbenennen.
Nun können die verbleibenden Schritte der Entwicklungsaufgabe ausgeführt werden.
Abschließen der Entwicklungsaufgabe
Nachdem das Schema für die Tabelle nun korrigiert ist, müssen die folgenden Objekte erstellt werden:
Eine Ansicht mit der Komplettübersicht über den Abwesenheitsverlauf der einzelnen Mitarbeiter
Eine gespeicherte Prozedur zum Erfassen der Abwesenheit sowie zum Aktualisieren der Urlaubsstunden für den Mitarbeiter, sofern es sich bei der Abwesenheit um einen Urlaub handelt.
So fügen Sie die Ansicht "vEmployeeAbsenceHistory" hinzu
Erweitern Sie in der Schemaansicht im Schema "HumanResources" den Knoten Ansichten.
Klicken Sie mit der rechten Maustaste auf den Knoten Ansichten, zeigen Sie auf Hinzufügen, und klicken Sie auf Ansicht.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie im Feld Name den Namen vEmployeeAbsenceHistory ein, und klicken Sie auf Hinzufügen.
Der Transact-SQL-Editor wird mit der Definition der Ansicht geöffnet.
Ersetzen Sie im Transact-SQL-Editor die vorhandene Ansichtsdefinition durch den folgenden Code:
CREATE VIEW [HumanResources].[vEmployeeAbsenceHistory] AS SELECT a.* ,c.[Title] ,c.[FirstName] ,c.[MiddleName] ,c.[LastName] ,c.[Suffix] FROM [HumanResources].[Employee] e INNER JOIN [Person].[Person] c ON c.[BusinessEntityID] = e.[BusinessEntityID] INNER JOIN [AbsenceHistory] a ON e.[BusinessEntityID] = a.[EmployeeID] ; GO EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = 'Returns employee name and absence history.', @level0type = N'SCHEMA', @level0name = N'HumanResources', @level1type = N'VIEW', @level1name = N'vEmployeeAbsenceHistory';
Mit diesem Code wird eine Ansicht definiert, von der Daten aus den Tabellen "Employee", "Contact" und "AbsenceHistory" zurückgegeben werden.
Klicken Sie im Menü Datei auf HumanResources.vEmployeeAbsenceHistory.view.sql speichern.
Im nächsten Schritt wird eine gespeicherte Prozedur hinzugefügt.
So fügen Sie die gespeicherte Prozedur "uspRecordAbsence" hinzu
Erweitern Sie in der Schemaansicht im Schema "HumanResources" den Knoten Programmierung und anschließend den Knoten Gespeicherte Prozeduren.
Klicken Sie mit der rechten Maustaste auf den Knoten Gespeicherte Prozeduren, zeigen Sie auf Hinzufügen, und klicken Sie auf Gespeicherte Prozedur.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Geben Sie unter Name den Namen uspRecordAbsence ein, und klicken Sie auf Hinzufügen.
Der Transact-SQL-Editor wird mit der Definition der gespeicherten Prozedur geöffnet.
Ersetzen Sie im Transact-SQL-Editor die vorhandene Definition der gespeicherten Prozedur durch den folgenden Code:
CREATE PROCEDURE [HumanResources].[uspRecordAbsence] @EmployeeID INT, @AbsenceType NCHAR(1), @StartDate DATETIME, @EndDate DATETIME AS BEGIN BEGIN TRANSACTION INSERT INTO [AbsenceHistory] (EmployeeID, BeginDate, EndDate, AbsenceType) VALUES(@EmployeeID, @StartDate, @EndDate, @AbsenceType) IF (@AbsenceType = 'V') BEGIN UPDATE [Employee] SET [VacationHours] = [VacationHours] - DateDiff(day, @StartDate, @EndDate) WHERE [BusinessEntityID] = @EmployeeID END COMMIT TRANSACTION END;
Mit diesem Code wird eine gespeicherte Prozedur definiert, von der eine Zeile in die Tabelle "AbsenceHistory" eingefügt und das Feld "VacationHours" in der Tabelle "Employee" aktualisiert wird (sofern der Abwesenheitstyp "V" lautet).
Klicken Sie im Menü Datei auf dbo.uspRecordAbsence.proc.sql speichern.
In der nächsten Prozedur behandeln Sie Feedback, das Sie im Rahmen einer Codeüberprüfung erhalten.
Behandeln von Codeüberprüfungsfeedback
Im Zuge der gemeinsamen Codeüberprüfung mit einem anderen Teammitglied haben Sie Feedback zu mehreren bewährten Methoden erhalten. Ihnen wurde nahegelegt, "SELECT *" möglichst nicht zu verwenden, da ansonsten beim Ausführen der statischen Codeanalyse für den Datenbankcode Warnungen ausgegeben werden. Darüber hinaus wurde Ihnen geraten, die Namen in der gespeicherten Prozedur voll zu qualifizieren. Und schließlich wurden Sie gebeten, die Spalte "BeginDate" in der Tabelle "AbsenceHistory" zu "StartDate" umzubenennen.
Tipp
Codierungsstandards und -anforderungen unterscheiden sich von Team zu Team. Halten Sie sich beim Schreiben von Transact-SQL-Code an die Codierungsstandards Ihrer Organisation. In dieser exemplarischen Vorgehensweise werden zwei Probleme veranschaulicht. Üblicherweise werden diese Techniken nicht nur für ein einzelnes Datenbankobjekt, sondern für jeden neuen Code angewendet (beispielsweise die Verwendung vollqualifizierter Namen in neuem Code).
Wie bereits erwähnt: Die Implementierung dieser Arten von Änderungen kann sich als zeitaufwändig und fehleranfällig erweisen. Mithilfe der Datenbankumgestaltung können Sie Datenbankcode, Testcode sowie Datengenerierungspläne schnell und einfach aktualisieren.
So erweitern Sie "SELECT *" in der Ansichtsdefinition
Doppelklicken Sie in der Schemaansicht auf die Ansicht "vEmployeeAbsenceHistory".
Der Transact-SQL-Editor wird mit der Definition der Ansicht geöffnet.
Zeigen Sie im Menü Daten auf Umgestalten, und klicken Sie auf Platzhalter erweitern.
Das Dialogfeld Vorschau der Änderungen wird angezeigt.
Klicken Sie in der Liste Platzhalter erweitern auf a.*.
Im Bereich Vorschau der Änderungen werden die Updates angezeigt, die für die Ansicht übernommen werden.
Klicken Sie auf Übernehmen.
Die Änderungen werden für das Datenbankprojekt übernommen. Im nächsten Schritt werden die Namen in der gespeicherten Prozedur voll qualifiziert, die Sie zuvor in dieser exemplarischen Vorgehensweise definiert haben.
So führen Sie eine Vollqualifizierung der Namen in der gespeicherten Prozedur aus
Doppelklicken Sie in der Schemaansicht auf die gespeicherte Prozedur "uspRecordAbsence".
Der Transact-SQL-Editor wird mit der Definition der gespeicherten Prozedur geöffnet.
Zeigen Sie im Menü Daten auf Umgestalten, und klicken Sie dann auf Vollqualifizierte Namen.
Das Dialogfeld Vorschau der Änderungen wird mit allen Änderungen angezeigt, die vorgenommen werden, wenn Sie den Umgestaltungsvorgang für das Projekt übernehmen.
Überprüfen Sie die Änderungen, und klicken Sie anschließend auf Übernehmen.
Die Änderungen werden für das Datenbankprojekt übernommen.
So benennen Sie die Spalte "BeginDate" um
Erweitern Sie in der Schemaansicht die Tabelle "AbsenceHistory", erweitern Sie den Knoten "Spalten", und klicken Sie auf die Spalte "BeginDate".
Zeigen Sie im Menü Daten auf Umgestalten, und klicken Sie dann auf Umbenennen.
Das Dialogfeld Umbenennen wird angezeigt.
Tipp
Sie können auch in der Schemaansicht mit der rechten Maustaste auf "BeginDate" klicken, auf Umgestalten zeigen und anschließend auf Umbenennen klicken.
Geben Sie unter Neuer Name den Namen "StartDate" ein.
Aktivieren Sie das Kontrollkästchen Vorschau der Änderungen anzeigen, und klicken Sie auf OK.
Das Dialogfeld Vorschau der Änderungen wird mit allen Änderungen angezeigt, die vorgenommen werden, wenn Sie den Umbenennungsvorgang für das Datenbankprojekt übernehmen.
Klicken Sie auf Übernehmen.
Die Änderungen werden vorgenommen. Der Spaltenname wird aktualisiert, und der neue Spaltenname wird in der Schemaansicht für alle aktualisierten Objekte angezeigt. Wenn Sie die Definition für die Datumseinschränkung öffnen, die Sie zuvor in diesem Thema angegeben haben, wurde die Einschränkung ebenfalls mit dem neuen Spaltennamen aktualisiert.
Nächste Schritte
An dieser Stelle werden die Aktualisierungen üblicherweise gemeinsam mit dem Teammitglied überprüft, von dem die Codeüberprüfung ausgeführt wurde. Anschließend werden die Änderungen in die Versionskontrolle eingecheckt. Sie haben nun das Datenbankprojekt (also die Offlinedarstellung des Datenbankschemas) aktualisiert. Dieses Datenbankprojekt muss für eine Zieldatenbank bereitgestellt werden, um das bereitgestellte Schema zu aktualisieren.
Wenn Sie einen Umgestaltungsvorgang für das Datenbankprojekt übernehmen, werden Informationen zu diesem Vorgang in einer Umgestaltungsprotokolldatei erfasst, sofern das Objekt mithilfe von "sp_rename" oder "ALTER" umbenannt oder verschoben werden kann. In dieser exemplarischen Vorgehensweise wird die Protokolldatei "RefactorAdventureWorks.refactorlog" genannt. Die Umgestaltungsprotokolldatei wird zur Bereitstellungszeit verwendet, um die Absicht Ihrer Umgestaltung beizubehalten. Im Umgestaltungsprotokoll werden beispielsweise Änderungen erfasst, wenn Sie eine Spalte umbenennen. Zur Bereitstellungszeit wird dank dieser Informationen dafür gesorgt, dass die Spalte mit dem alten Namen nicht zusammen mit den enthaltenen Daten verworfen und eine leere Spalte mit einem neuen Namen erstellt wird. Bei Verwendung der Umgestaltung müssen dem Skript vor der Bereitstellung und dem Skript nach der Bereitstellung keine Anweisungen hinzugefügt werden, um die Daten beizubehalten.
Siehe auch
Aufgaben
Gewusst wie: Bereitstellen von Datenbankumgestaltungsänderungen
Konzepte
Verschieben eines Datenbankobjekts in ein anderes Schema
Vollqualifizierte Namen für Datenbankobjekte
Erweitern von Platzhalterzeichen in SELECT-Anweisungen
Analysieren von Datenbankcode zum Verbessern der Codequalität