Erweitern der Datenbankfunktionen von Visual Studio
Sie können Visual Studio Premium oder Visual Studio Ultimate mit Funktionserweiterungen erweitern. Mit diesen Funktionserweiterungen können Sie Funktionen von Visual Studio Premium oder Visual Studio Ultimate erweitern, z. B. Umgestaltungen, Datengenerierung, Komponententests und Datenbankcodeanalysen. Beim Erstellen von Funktionserweiterungen verwenden Sie ein vorhandenes Framework für die Basisfunktion. Dadurch wird der Umfang des Codes, den Sie schreiben müssen, stark reduziert.
Funktionserweiterungen weisen klar definierte Erweiterungspunkte auf. Sie müssen das Visual Studio SDK nicht installiert haben, um Funktionserweiterungen für Visual Studio Premium oder Visual Studio Ultimate erstellen zu können.
Häufige übergeordnete Aufgaben
Übergeordnete Aufgabe |
Unterstützender Inhalt |
---|---|
Informationen zu Konzepten bei der Datenbankerweiterbarkeit: Bevor Sie diese Funktionen erweitern, sollten Sie sich mit der Funktionsweise der Erweiterbarkeit in Visual Studio Premium oder Visual Studio Ultimate vertraut gemacht haben. Ein Datenbankschema-Anbieter implementiert alle Dienste, die für eine bestimmte Marke und Version einer Datenbank (z. B. SQL Server 2008) spezifisch sind. Dazu gehören: Der Parser, von dem die Skripts für die Datenbank gelesen und geschrieben werden, das Skript-Domänenobjektmodell (Skript-DOM), das die Skripts darstellt, und das Schemamodell, das die Objekte, Beziehungen und Eigenschaften der Datenbankobjekte modelliert. Immer wenn Sie in Visual Studio Premium oder Visual Studio Ultimate mit einer Funktion oder Funktionserweiterung interagieren, verwenden diese Funktionen und Funktionserweiterungen eine Kombination der DSP-Dienste, des Skript-DOMs und des Schemamodells. |
|
Unterstützung für neue Datenbankumgestaltungstypen: Sie können Funktionserweiterungen für die Datenbankumgestaltung erstellen, um neue Datenbankumgestaltungstypen zu aktivieren. Jeder neue Umgestaltungstyp erfordert auch einen oder mehrere neue Umgestaltungscontributors. |
|
Unterstützung für neue Datenbankumgestaltungsziele hinzufügen: Sie können einen vorhandenen Datenbankumgestaltungstyp aktivieren, um einen neuen Artefakttyp zu aktualisieren, z. B. eine Textdatei, oder um Datenbankinformationen aus der Anwendung eines Drittanbieters auszugeben. Wenn Sie einen neuen Umgestaltungstyp erstellen, müssen Sie einen oder mehrere Umgestaltungscontributors implementieren, damit dieser Typ für Artefakte im Datenbankprojekt verwendet werden kann. |
|
Neue Analyseregeln für Datenbankcode definieren: Sie können neue Analyseregeln für Datenbankcode definieren, um nach Problemen zu suchen, die anhand der Regeln in Visual Studio Premium oder Visual Studio Ultimate nicht erkannt werden. |
|
Benutzerdefinierte Datengeneratoren erstellen: Sie können benutzerdefinierte Datengeneratoren verwenden, um realistische Testdaten zu generieren, bei denen vertrauliche Informationen nicht offen gelegt werden. Sie können benutzerdefinierte Datengeneratoren erstellen, um die Datengeneratoren Visual Studio Premium oder Visual Studio Ultimate zu ergänzen. |
|
Benutzerdefinierte Testbedingungen für Datenbankkomponenten hinzufügen: Sie können benutzerdefinierte Testbedingungen hinzufügen, um die Möglichkeiten zur Überprüfung des Verhaltens von Datenbankobjekten zu erweitern, die von den integrierten Komponententestbedingungen bereitgestellt werden. |
|
Datenbankprojektverhalten anpassen: Durch Definieren einer benutzerdefinierten Datenbankprojektfunktion können Sie das Projektverhalten in einer Weise ändern, die von den integrierten Datenbankprojekten nicht unterstützt wird. |
Modellieren einer Datenbank
Um eine Datenbank zu modellieren, modelliert Visual Studio sowohl die Skripts, aus denen die Datendefinitionssprache (DDL) der Datenbank besteht, als auch die Datenbank, die aus einer Ausführung der Skripts resultieren würde. Das Modell der DDL-Skripts wird vom Skript-DOM bereitgestellt. Das Modell der resultierenden Datenbank wird vom Schemamodell bereitgestellt.
Datenfluss zwischen Erweiterbarkeitskomponenten
Im folgenden Diagramm wird der Datenfluss durch diese Komponenten veranschaulicht.
Datenfluss zwischen Erweiterbarkeitskomponenten
Die Definitionen der Datenbankobjekte werden im Datenbankprojekt in Form von DDL-Skripts beibehalten. Wenn Sie ein Datenbankprojekt öffnen, werden die Skripts gelesen, und zwei Modelle werden aufgefüllt: das Skript-DOM-Modell und das Schemamodell. Funktionen von Visual Studio Premium interagieren mit beiden Modellen, und wenn Sie Änderungen an Datenbankobjekten speichern, werden die Änderungen in DDL-Skripts übernommen.
Erweiterbarkeitskomponenten in der Database Edition
Im folgenden Diagramm werden die Komponenten veranschaulicht, deren Interaktion die Erweiterung der Funktionen von Database Edition ermöglicht.
Kommunikation zwischen Erweiterbarkeitskomponenten
Wenn Sie ein Datenbankprojekt öffnen oder erstellen, werden alle registrierten Datenbankschema-Anbieter von der Erweiterungs-Manager-Komponente geladen. Wenn Sie bestimmte Funktionen für einen Datenbankschema-Anbieter (DSP) verwenden, werden die Funktionen und Erweiterungen, die diesen DSP unterstützen, von der Erweiterungs-Manager-Komponente geladen. Wenn Sie beispielsweise Objekte in einer SQL Server 2008-Datenbank durch Umgestaltungen mit Umbenennung umbenennen, wird die Umgestaltungsfunktion mit den Umgestaltungstypen und Contributors für SQL Server 2008 geladen.
Der Erweiterungs-Manager
Wenn Sie Visual Studio Premium oder Visual Studio Ultimate ausführen interagieren alle Datenbankprojekte, Schemaanbieter, Funktionen und Funktionserweiterungen mit dem Singleton- ExtensionManager. Der Erweiterungs-Manager lädt für jedes Datenbankprojekt eine einzelne Instanz, die von DatabaseSchemaProvider abgeleitetet wurde. Wenn Visual Studio Premium oder Visual Studio Ultimate beispielsweise ein Microsoft SQL Server 2005-Projekt öffnet, wird eine Instanz von Sql90DatabaseSchemaProvider (abgeleitet von DatabaseSchemaProvider) vom Erweiterungs-Manager geladen.
Der Erweiterungs-Manager lädt Erweiterungen auf Basis des Typs der Schnittstelle, die von den Erweiterungen implementiert wird. Wenn Sie beispielsweise die Funktion für Datenbankkomponententests verwenden, wird vom Erweiterungs-Manager eine Liste von registrierten Erweiterungen zurückgegeben, die die TestCondition-Basisklasse erben und mit dem Datenbankschema-Anbieter für das Datenbankprojekt kompatibel sind.
Kompatibilität von Funktionserweiterungen
Eine Funktion wie die Umgestaltung oder die Analyse von statischem Code besteht aus Komponenten, die spezifisch für einen Datenbankschema-Anbieter (Database Schema Provider, DSP) sind, sowie aus Komponenten, die alle DSPs unterstützen (DSP-unabhängige Komponenten). Wenn Sie eine Funktionserweiterung definieren, deklarieren Sie die Kompatibilität dieser Erweiterung mit einem bestimmten DSP oder einem Basis-DSP, sodass die Erweiterung nur für die entsprechenden Projekttypen geladen wird. Beispielsweise können Sie angeben, dass die Erweiterung entweder mit Sql90DatabaseSchemaProvider (zur Einschränkung auf SQL Server 2005-Projekte) oder mit SqlDatabaseSchemaProvider kompatibel sein soll (die Basisklasse für SQL Server 2005- und SQL Server 2008-DSPs). Sie können auch eine Erweiterung deklarieren, die mit mehrerem spezifischen DSPs kompatibel ist. Sie können diese Vorgehensweise verwenden, wenn Sie nicht sicher sind, ob zukünftige Versionen die Funktion möglicherweise beschädigen. Sie können eine Funktion als kompatibel mit allen DSPs deklarieren, indem Sie sie als kompatibel mit der DatabaseSchemaProvider-Basisklasse delarieren.
Beispiele
Erweiterung als kompatibel mit einem DSP deklarieren:
// SqlSchemaObjectDesigners is defined as compatible with all Sql
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(Sql90DatabaseSchemaProvider))]
internal class SqlSchemaObjectDesigners : ISchemaObjectDesigners
{
}
Erweiterung als kompatibel mit mehrerem DSPs deklarieren:
// Extension InconclusiveCondition is defined as compatible with all
// SQL Server database services providers and Oracle database
// services providers.
[DatabaseSchemaProviderCompatibility (typeof(SqlDatabaseSchemaProvider))]
[DatabaseSchemaProviderCompatibility (typeof(OracleDatabaseSchemaProvider))]
public sealed class InconclusiveCondition : TestCondition
{
}
Erweiterung als kompatibel mit allen DSPs deklarieren:
// Extension ReportingService is defined as compatible with all
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(DatabaseSchemaProvider))]
internal class ReportingService : IReportingService
{
}
Erweiterung als kompatibel mit keinem DSP deklarieren:
// Extension ExecutionTimeCondition is defined as compatible with no
// database services providers. That means if a feature
// has an ExtensionManager constructed with null, it will load
// those extensions defined as binding to
// DspCompatibilityCategory.None
[DatabaseSchemaProviderCompatibility (DspCompatibilityCategory.None)]
public sealed class ExecutionTimeCondition : TestCondition
{
}
Typen von Funktionserweiterungen
Sie können Funktionserweiterungen erstellen, die die Leistung mehrerer Funktionen von Visual Studio Premium oder Visual Studio Ultimate verbessern. In der folgenden Tabelle werden die Typen von Erweiterungen beschrieben, die Sie erstellen können.
Feature |
Erweiterungstyp |
Beschreibung |
---|---|---|
Datenbankkomponententests |
Komponententestbedingungen |
Sie können benutzerdefinierte Assertions hinzufügen, um Erfolg oder Fehlschlagen der Tests zu ermitteln. Der Großteil der Komponententest-APIs sind öffentliche APIs. Sie stellen jedoch keinen Erweiterungspunkt dar. Mit diesen APIs werden Datenbankkomponententests erstellt, die in verwaltetem Code geschrieben werden, z. B. in Visual C# oder Visual Basic. Weitere Informationen finden Sie unter Definieren benutzerdefinierter Bedingungen für Datenbankkomponententests. |
Datengenerierung |
Datengeneratoren |
Wenn die in Visual Studio Premium oder Visual Studio Ultimate bereitgestellten Datengeneratoren Ihren Anforderungen nicht entsprechen, können Sie die Erweiterungs-API verwenden, um benutzerdefinierte Datengeneratoren zu erstellen. Weitere Informationen finden Sie unter Generieren spezialisierter Testdaten mit einem benutzerdefinierten Daten-Generator. |
Datenbankcodeanalyse |
Codeanalyseregeln |
Sie können eigene Codeanalyseregeln definieren, um bestimmte Probleme im Datenbankcode zu überprüfen. Weitere Informationen finden Sie unter Erstellen und Registrieren zusätzlicher Regeln für die Datenbankcodeanalyse. |
Datenbankumgestaltung |
Umgestaltungsziele |
Sie können vorhandene Umgestaltungstypen erweitern, um diese für neue Ziele zu verwenden, z. B. für neue Dateitypen. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erweitern der Datenbankumbenennung durch Umgestaltung auf die Verarbeitung von Textdateien. |
Datenbankumgestaltung |
Umgestaltungstypen |
Sie können neue Umgestaltungstypen erstellen. Beispielsweise können Sie geschachtelte Bedingungen durch Wächterklauseln ersetzen. Weitere Informationen finden Sie unter Erstellen benutzerdefinierter Typen oder Regeln für die Datenbankumgestaltung. |
Kernkomponenten von Datenbankschema-Anbietern
Ein Datenbankschema-Anbieter (DSP) besteht aus drei Gruppen von Komponenten:
Skript-DOM: ein Objektmodell und unterstützende Dienste, die ein beliebiges SQL-Skript mit DDL- und DML-Anweisungen modellieren.
Schemamodell: ein Objektmodell und unterstützende Dienste, die die Objekte in einer Datenbankinstanz modellieren, z. B. Tabellen, Ansichten und gespeicherte Prozeduren.
Benutzerinteraktionsdienste: eine Auflistung von Diensten, die Kernkomponenten aktivieren, um auf Benutzeroberflächenressourcen zuzugreifen, z. B. Zeichenfolgen, die die Namen von Objekten darstellen, Symbole, die die Objekttypen und die Kategorien darstellen, und die Hierarchien, in denen die Objekte angezeigt werden.
Die primären Funktionen eines DSP bestehen im Ermöglichen der Verarbeitung von DDL-Skripts in Darstellungen von Skript-DOMs und Schemamodellen sowie im Aktivieren der Umkehrfunktion zur Reproduktion von Skripts aus den zwei Modelldarstellungen.
Skript-DOM
Ein Skript-DOM stellt eine Implementierung zur Analyse eines DDL-Skripts in ein Objektmodell bereit, das das Skript darstellt. Das Skript-DOM stellt auch die Implementierung zum Reproduzieren des ursprünglichen Skripts aus dem Modell bereit.
Im folgenden Diagramm wird der Datenfluss im Skript-DOM veranschaulicht.
Datenfluss im Skript-DOM
Der Skript-DOM-Parser übersetzt das in einer unstrukturierten Textdatei gespeicherte Skript in ein Objekt, das die IScriptFragment-Schnittstelle erbt. Der Skriptgenerator im Skript-DOM verwendet ein Objekt, das die IScriptFragment-Schnittstelle erbt und das ursprüngliche Skript erzeugt. In den Datenbankschema-Anbietern für SQL Server, die in Visual Studio Premium oder Visual Studio Ultimate enthalten sind, werden von IScriptFragment eine abstrakte Syntaxstruktur und ein Tokenstream abstrahiert.
Token stellen eine unstrukturierte Darstellung eines Skripts bereit. Jedes Token in der Auflistung weist folgende Elemente auf:
Tokentyp (z. B. Schlüsselwort oder Zeichenfolgenliteral)
Tokenzeichenfolge
Quelldatei mit dem Token
Offset in der Datei mit dem Token
Abstrakte Syntaxstrukturen stellen eine strukturierte Darstellung des Skripts bereit. Jeder Knoten in der abstrakten Syntaxstruktur stellt einen Batch von Anweisungen, eine Anweisung oder eine Komponente einer Anweisung (z. B. einen Ausdruck) dar. Abstrakte Syntaxstrukturen werden verwendet, um Skripts zu analysieren, nachdem sie analysiert wurden. Abstrakte Strukturen werden außerdem verwendet, um Skripts programmgesteuert zu erstellen.
Schemamodell
Die Schemamodelldarstellung ist ein schnittstellenbasiertes Objektmodell, das eine Livedatenbankinstanz modelliert. Schnittstellen werden in einer Ableitungshierarchie angeordnet, die eine einzelne abstrakte Ebene enthält, die von allen DSPs gemeinsam verwendet wird, sowie eine beliebige Anzahl abstrakter Ebenen für spezifischere Modelldetails. So erbt die ISql90Table-Schnittstelle ISqlTable, die wiederum die IDatabaseTable-Schnittstelle der abstrakten Ebene erbt. Das Schemamodell verwendet die IScriptFragment-Objekte und übersetzt sie in Schemamodellelemente; außerdem wird eine umgekehrte Konvertierung von Schemamodellelementen in IScriptFragment-Objekte durchgeführt. Das Schemamodell besteht aus einigen Implementierungen von Modellerstellungstools. Jede Implementierung erstellt ein Modell aus einer anderen Ressource im System. Beispielsweise erstellt der ScriptModelComposer ein Modell aus den Skriptdateien, die im Datenbankprojekt verwaltet werden.
Die Infrastruktur des Schemamodells (ModelStore und die unterstützenden Klassen) implementiert integrierte Skript-DOM-Verweise direkt aus Modellelementen. Dies ermöglicht die Modellierung von Objekten wie gespeicherten Prozeduren, die beliebige Skripts enthalten.
Ein Schemamodell besteht aus einer Auflistung von Elementen und Anmerkungen. Elemente beschreiben das Artefakt, das modelliert wird (z. B. Tabellen, Ansichten, gespeicherte Prozeduren, Trigger, Spalten). Anmerkungen werden verwendet, um dem Modell beliebige Daten zuzuordnen. Anmerkungen werden von den Kernkomponenten des Datenbankprojekts verwendet; außerdem können Anmerkungen von Projektfunktionen und Funktionserweiterungen verwendet werden. Elemente und Anmerkungen können benannt werden oder anonym sein.
Modellelemente
Elemente bestehen aus Eigenschaften und Beziehungen. Eigenschaften stellen grundlegende Daten dar, z. B. ganze Zahlen, boolesche Werte und Zeichenfolgen, und werden verwendet, um die Details des Modells zu erfassen. Beziehungen stellen benannte und typisierte Verbindungen zwischen Elementen dar. Beispielsweise weist ein ISqlTable-Element eine Beziehung des Typs ISqlColumn mit dem Namen "Spalten" auf, die die Tabelle den zugehörigen Spalten zuordnet.
Es gibt drei grundlegende Typen von Beziehungen:
Peer: stellt eine beliebige Abhängigkeit eines Elements von einem anderen Element dar. In SQL Server wird die Beziehung zwischen einer Ansicht und einer Tabelle am besten als Peer-Beziehung modelliert.
Zusammensetzen: stellt ein Element dar, das aus anderen Elementen besteht. In SQL Server wird die Beziehung zwischen einer Tabelle und den Spalten der Tabelle am besten als zusammengesetzte Beziehung modelliert. Ein zentrales Prinzip einer zusammengesetzten Beziehung besteht darin, dass die beiden Elemente zur gleichen Zeit in einer Aktion erstellt werden. Die Elemente weisen keine Abhängigkeitsreihenfolge zum Erstellen oder Entfernen auf. Die Richtung der Abhängigkeit zwischen dem übergeordneten und dem untergeordneten Element wird jedoch vom Modell verwaltet, um assoziative Abhängigkeiten zu ermöglichen. Wenn eine Spalte beispielsweise von einem bestimmten Typ abhängig ist, ist die Tabelle aufgrund der Abhängigkeit der übergeordneten Tabelle von der zusammengesetzten Spalte auch von diesem Typ abhängig.
Hierarchisch: stellt eine Hierarchie dar. Hierarchische Beziehungen unterscheiden sich von zusammengesetzten Beziehungen, da die Richtung der Abhängigkeit vom untergeordneten Element zum übergeordneten Element (und nicht umgekehrt) besteht. Ein Beispiel in SQL Server ist die Beziehung zwischen einem Schema und einem zugehörigen Objekt, z. B. einer Tabelle oder einer Ansicht. Eine Tabelle ist mit dem Schema an einer hierarchischen Beziehung beteiligt.
Das folgende Diagramm zeigt die drei verschiedenen Typen von Beziehungen, die im Schemamodell dargestellt werden können.
Objektbeziehungen im Schemamodell
Jede Beziehung in einem Modell deklariert, ob es sich um eine Multibeziehung oder um eine einzelne Beziehung handelt. In jedem Fall kann ein Element eine leere Beziehung aufweisen. Modelle können unvollständige Modelle des tatsächlichen Artefakts sein.
Elemente sind schnittstellenbasiert, um die folgenden Funktionen in einer Speicherimplementierung zu unterstützen:
Starke Elementtypisierung (Identität)
Mehrfachvererbung
So unterstützen Sie sowohl DSP-unabhängige als auch DSP-spezifische Teile des Systems
So unterstützen Sie das Freigeben von "Qualitäten" in anderweitig nicht zusammengehörigen Elementtypen
Flexibilität und Erweiterbarkeit von Versionen
Alle Modellelementklassen implementieren die öffentliche IModelElement-Schnittstelle. Auf Eigenschaften, Beziehungen und Anmerkungen kann mit der ModelStore Metadaten-API von dieser Klasse zugegriffen werden. Die Schnittstellen, z. B. IDatabaseTable, vereinfachen den Zugriff (mit Bindung zur Kompilierzeit) auf Eigenschaften und Beziehungen und erleichtern die Verwaltung.
Modellanmerkungen
Ähnliche wie Elemente bestehen Anmerkungen aus Eigenschaften. Im Gegensatz zu Elementen nehmen Anmerkungen nicht an Beziehungen teil. Stattdessen werden Anmerkungen an Elemente oder an den Modellspeicher selbst angefügt. Anmerkungen sind stark typisiert, und eine einzelne Instanz einer Anmerkung kann an den Modellspeicher und an mehrere Elemente angefügt werden. Anmerkungen, die an Modelle angefügt sind, stellen eine "globale" Instanzen für das Modell dar.