擴充 Visual Studio 的資料庫功能
您可以透過建立「擴充功能」(Feature Extension),來擴充 Visual Studio Premium 或 Visual Studio Ultimate。 這些擴充功能可讓您擴充 Visual Studio Premium 或 Visual Studio Ultimate 的功能,例如重構、資料產生、單元測試以及資料庫程式碼分析。 建立擴充功能時,其基底功能皆是使用現有架構,故可大幅減少您必須撰寫的程式碼量。
擴充功能具有完整定義的擴充點。 您不一定要有 Visual Studio SDK 才可建立 Visual Studio Premium 或 Visual Studio Ultimate 的擴充功能。
一般高階工作
高階工作 |
支援內容 |
---|---|
了解資料庫擴充性的概念:開始擴充那些功能之前,您應了解擴充性如何在 Visual Studio Premium 或 Visual Studio Ultimate 中運作。 資料庫結構描述提供者會實作特定品牌和版本資料庫 (例如 SQL Server 2008) 的所有特定服務。 這包括讀取和寫入該資料庫指令碼的剖析器、表示指令碼的「指令碼網域物件模型」(Script Domain Object Model,Script DOM),以及建立「資料庫物件」(Database Object) 之物件、關係和屬性模型的「結構描述模型」(Schema Model)。 在 Visual Studio Premium 或 Visual Studio Ultimate 中,無論何時與功能或擴充功能互動,那些功能和擴充功能都會處理 DSP 服務、指令碼 DOM 和結構描述模型的部分組合。 |
|
加入新資料庫重構類型的支援:您可以建立「資料庫重構」(Database Refactoring) 的擴充功能,以啟用資料庫重構的新類型。 每個新的重構類型都需要一個或多個重構參與者。 |
|
加入新資料庫重構目標的支援:您可以啟用現有類型的資料庫重構,以更新新類型的成品,例如文字檔案,或是由協力廠商應用程式所產生、內含資料庫資訊的輸出。 如果建立新的重構類型,則必須實作一個或多個重構參與者,以讓該類型可以在屬於您「資料庫專案」(Database Project) 中的成品上運作。 |
|
定義新資料庫程式碼分析規則:您可以定義新資料庫程式碼分析規則,其會查找 Visual Studio Premium 或 Visual Studio Ultimate 中包含的規則未能偵測到的問題。 |
|
建立自訂資料產生器:自訂資料產生器可用來產生接近現實的測試資料,且不會使機密資訊外洩。 您可以建立自訂資料產生器,以補充 Visual Studio Premium 或 Visual Studio Ultimate 中包含的資料產生器。 |
|
加入自訂資料庫單元測試條件:透過定義自訂測試條件,您可以使用內建單元測試條件不支援的方式驗證資料庫物件的行為。 |
|
自訂資料庫專案行為:您可以定義自訂資料庫專案功能,以將專案行為修改為內建資料庫專案不支援的行為。 |
建立資料庫的模型
若要建立資料庫的模型,Visual Studio 會建立組成資料庫「資料定義語言」(Data Definition Language,DDL) 的指令碼以及供這些指令碼執行並產生結果之資料庫的模型。 DDL 指令碼的模型由指令碼 DOM 提供。 產生資料庫的模型由結構描述模型提供。
擴充性元件之間的資料流程
下圖顯示這些元件之間的資料流程。
擴充性元件之間的資料流程
資料庫物件的定義以 DDL 指令碼格式保存在資料庫專案中。 當開啟資料庫專案時,系統會讀取那些指令碼,並填入兩個模型:指令碼 DOM 模型和結構描述模型。 Visual Studio Premium 的功能可與這兩個模型互動,當儲存資料庫物件的變更時,那些變更會保存回 DDL 指令碼中。
Database 版中的擴充性元件
下圖顯示可進行互動以讓您擴充 Database 版功能的元件。
擴充性元件之間的通訊
當您開啟或建立資料庫專案時,擴充管理員元件會載入任何註冊的資料庫結構描述提供者。 當您使用資料庫結構描述提供者 (DSP) 的特定功能時,擴充管理員元件會載入支援該 DSP 的功能及其擴充功能。 例如,當您使用重新命名重構功能來重新命名 SQL Server 2008 資料庫中的物件時,重構功能會連同 SQL Server 2008 的重構類型和參與者一起載入。
擴充管理員
當您執行 Visual Studio Premium 或 Visual Studio Ultimate 時,所有資料庫專案、結構描述提供者、功能和擴充功能都會與單一 ExtensionManager 互動。 擴充管理員會針對每個資料庫專案,載入衍生自 DatabaseSchemaProvider 的單一執行個體。 例如,當 Visual Studio Premium 或 Visual Studio Ultimate 開啟 Microsoft SQL Server 2005 專案時,擴充管理員會載入 Sql90DatabaseSchemaProvider (衍生自 DatabaseSchemaProvider) 的執行個體。
擴充管理員會根據擴充功能所實作的介面類型來載入那些擴充功能。 例如,當您使用資料庫單元測試功能時,擴充管理員會傳回內含已註冊且繼承自 TestCondition 基底類別的擴充功能以及與資料庫專案的資料庫結構描述提供者相容的擴充功能之清單。
擴充功能相容性
諸如重構或靜態程式碼分析的功能由 DSP 特定的元件和支援所有 DSP (DSP 無從驗證元件) 組成。 當您定義擴充功能時,會使用特定 DSP 或基底 DSP 宣告該擴充功能的相容性,以便只針對正確的專案類型載入擴充功能。 例如,您可以宣告擴充功能是與 Sql90DatabaseSchemaProvider 相容 (以將其限制為 SQL Server 2005 專案) 還是與 SqlDatabaseSchemaProvider (SQL Server 2005 和 SQL Server 2008 DSP 的基底類別) 相容。 您能也可以宣告擴充功能與多個特定 DSP 相容。 如果您不確定以後的版本是否會中斷您的功能,您可以使用此方法。 若要宣告功能與所有 DSP 相容,請宣告它與 DatabaseSchemaProvider 基底類別相容。
範例
定義擴充功能與一個 DSP 相容:
// SqlSchemaObjectDesigners is defined as compatible with all Sql
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(Sql90DatabaseSchemaProvider))]
internal class SqlSchemaObjectDesigners : ISchemaObjectDesigners
{
}
定義擴充功能與多個 DSP 相容:
// 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
{
}
定義擴充功能與所有 DSP 相容:
// Extension ReportingService is defined as compatible with all
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(DatabaseSchemaProvider))]
internal class ReportingService : IReportingService
{
}
定義擴充功能不與任何 DSP 相容:
// 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
{
}
擴充功能的類型
您可以建立擴充功能,以加強 Visual Studio Premium 或 Visual Studio Ultimate 的數個功能。 下表描述您可以建立之擴充功能的類型。
功能 |
擴充功能類型 |
說明 |
---|---|---|
資料庫單元測試 |
單元測試條件 |
您可以加入自訂判斷提示,以判斷測試成功或失敗。 大部分的單元測試 API 都是公用的,但並不代表是擴充點。 那些 API 是用來建立以 Managed 程式碼所撰寫的「資料庫單元測試」(Database Unit Test),例如 Visual C# 或 Visual Basic。 如需詳細資訊,請參閱定義資料庫單元測試的自訂條件。 |
資料產生 |
資料產生器 |
如果 Visual Studio Premium 或 Visual Studio Ultimate 提供資料產生器,您可以使用擴充性 API,來建立自訂資料產生器。 如需詳細資訊,請參閱使用自訂資料產生器產生特製化測試資料。 |
資料庫程式碼分析 |
程式碼分析規則 |
您可以定義自己的程式碼分析規則,以檢查資料庫程式碼中的特定問題。 如需詳細資訊,請參閱建立和註冊用於分析資料庫程式碼的其他規則。 |
資料庫重構 |
重構目標 |
您可以擴充現有重構類型,以運作於新的目標之上,例如新的檔案類型。 如需詳細資訊,請參閱 逐步解說:擴充資料庫重新命名重構以處理文字檔。 |
資料庫重構 |
重構類型 |
您可以建立新的重構類型,例如使用成立條件子句取代巢狀條件。 如需詳細資訊,請參閱建立自訂資料庫重構型別或目標。 |
資料庫結構描述提供者的核心元件
資料庫結構描述提供者 (DSP) 由三組元件組成:
指令碼 DOM - 物件模型和支援服務,其會建立包含 DDL 和 DML 陳述式的任意 SQL 指令碼模型。
結構描述模型 - 物件模型和支援服務,其會建立資料庫執行個體中物件的模型,例如資料表、檢視和預存程序。
使用者互動服務 - 服務的集合,可讓核心元件存取使用者介面資源,例如表示物件名稱的字串、表示物件類型與分類的圖示和可以顯示這些物件的階層結構。
DSP 的主要功能是使 DDL 指令碼轉換為指令碼 DOM 或結構描述模型皆為可行的。亦可使從這兩個模型重新產生指令碼的反向功能為可行的。
指令碼 DOM
指令碼 DOM 提供了可將 DDL 指令碼剖析為表示該指令碼之物件模型的實作。 指令碼 DOM 亦提供了可從模型重新產生原始指令碼的實作。
下圖顯示流經指令碼 DOM 的資料流程。
流經指令碼 DOM 的資料流程
指令碼 DOM 剖析器會將儲存在無結構文字檔案中的指令碼轉換為繼承 IScriptFragment 介面的物件。 指令碼 DOM 中的指令碼產生器會擷取繼承 IScriptFragment 介面的物件,並產生原始指令碼。 在 SQL Server 的資料庫結構描述提供者 (隨附於 Visual Studio Premium 或 Visual Studio Ultimate) 中,IScriptFragment 會擷取抽象語法樹狀結構 (AST) 和語彙基元資料流。
語彙基元提供指令碼的無結構表示。 集合中的每一個語彙基元都有:
語彙基元型別 (例如關鍵字或字串常值)
語彙基元字串
發生語彙基元的來源檔
發生語彙基元的來源檔內的位移
抽象語法樹狀結構 (AST) 提供指令碼的結構表示。 AST 中的每個節點表示一批次陳述式、一個陳述式或一個陳述式的元件 (例如運算式)。 AST 可用來在剖析指令碼之後對其進行分析。 AST 也可用來以程式設計的方式建置指令碼。
結構描述模型
結構描述模型表示是介面型物件模型,可建立實際資料庫執行個體的模型。 介面會排列在衍生階層中,其包括單一抽象層,由所有 DSP 與目標為其他特定模型詳細資料的抽象層任何成員共用。 例如,ISql90Table 介面繼承 ISqlTable,而它又繼承抽象層介面 IDatabaseTable。 結構描述模型會擷取 IScriptFragment 物件,並將它們轉換為結構描述模型項目;也會執行反向轉換,從結構描述模型項目轉換為 IScriptFragment 物件。 結構描述模型由部分模型撰寫者實作成員組成。 每個實作從系統的部分其他資源建立模型。 例如,ScriptModelComposer 可從資料庫專案中維護的指令碼檔案撰寫模型。
結構描述模型基礎結構 (ModelStore 及其支援類別) 會直接實作來自模型項目的整合結構描述 DOM 參考。 這可建立物件的模型,例如預存程序,其中包含任意指令碼。
結構描述模型包含項目和附註的組合。 項目說明正在建立模型的成品 (如資料表、檢視、預存程序、觸發程序、資料行等)。 附註用來建立任意資料與模型的關聯。 附註可用於資料庫專案核心元件,也可以用於專案功能和擴充功能。 可以命名項目和附註,也可以使用匿名。
模型項目
項目由屬性和關聯性組成。 屬性表示基本資料,例如整數、布林值和字串,且它們可用來擷取模型的詳細資料。 關聯性代表項目之間的已命名且具型別的連結。 例如,ISqlTable 項目維護型別為 ISqlColumn 的關聯性,其名稱為 "Columns",以建立資料表與其資料行的關聯。
下列是關聯性的三種基本類型:
對等 - 表示一個項目與另一個項目任意方式的相依性。 在 SQL Server 中,檢視表與資料表之間的關聯性最適於建立為對等關聯性模型。
組成 - 表示一個項目由其他項目組成。 在 SQL Server 中,資料表與其資料行之間的關聯性最適於建立為組成關聯性模型。 組成關聯性的主要原則是兩個項目是做為單一動作同時建立的。 項目的建立和移除沒有相依性順序。 然而,模型維護父代到子項的相依性方向,以啟用關聯相依性。 例如,如果資料行具有特別型別的相依性,則父代資料表與其組成資料行的相依性表示資料表也相依於該型別。
階層 - 代表階層。 階層關聯性與組成關聯性不同,因為該關聯性方向是從子項到父代 (而不是相反方向)。 在 SQL Server 中的範例是結構描述和所擁有物件 (如資料表或檢視表) 之間的關聯性。 資料表參與其結構描述的階層關聯性。
下圖顯示結構描述模型中可以表示的三個不同關聯性。
結構描述模型中的物件關聯性
模型中的每個關聯性都宣告其是多關聯性還是單一關聯性。 在所有情況下,項目可以維護空白關聯性。 模型可以是實際成品的不完整模型。
項目是介面型的,以支援儲存實作中的下列功能:
強制項目型別 (識別)
多重繼承
若要支援系統的 DSP 無從驗證和 DSP 特定部分
支援跨不相關項目型別共用「品質」
版本彈性和擴充性
所有模型項目類別實作公用 IModelElement 介面。 可以透過使用來自此類別的 ModelStore 中繼資料 API,來存取屬性、關聯性和附註。 諸如 IDatabaseTable 的介面可提供更簡單更易於維護的方式,來存取 (於編譯時間繫結)屬性和關聯性。
模型附註
與項目相似,附註由屬性組成。 與項目不同的是,附註不參與關聯性。 附註會自行附加至項目或模型存放區。 附註是強制型別的,且附註的單一執行個體除了可附加至模型存放區之外,還可附加至多個項目。 模型附加的附註表示模型的「全域」附註執行個體。