Alok Mehta和Ricardo Rodriguezc hina it power . c om5EQj32r
本文假设您熟悉 T-SQL、XML 和 XSLc hina it power . c om5EQj32r
Level of Difficulty 1 2 3c hina it power . c om5EQj32r
请下载本文的代码:MetaDataServices.exe(114KB)c hina it power . c om5EQj32r
摘要SQL Server 2000 Meta Data Services 是一种存储和管理 SQL Server 的元数据的知识库技术。利用 Meta Data Services,您无需反复地构建数据库架构,就可以冻结整个架构,以便在其他项目中使用。您还可以将这些架构用于培训、测试或调试。我们将在本文中讨论 Meta Data Services 的多个组件,说明如何使用 Visual Basic 客户端、XML 和 XSLT 对其进行编程。我们还会说明如何通过使用 SQL Server 知识库生成简单的数据库架构来管理和操作您的元数据。c hina it power . c om5EQj32r
元数据可以说是无处不在。它是数据库架构、对象模型、项目说明、文件制作、交叉引用、可重用组件、软件/硬件配置、业务规则和知识库的一个组成部分。虽然元数据很常见,但用于管理它的工具和方法却很少。在许多情况下,开发人员发现他们自己在为各种不同的项目重复地设计和实现类似的数据库架构。而且,当应用程序在生产环境中使用时,开发人员常常需要冻结没有数据的数据库架构版本,这样他们就可以将冻结的架构用于其他目的。开发人员可以使用全部冻结或部分冻结的架构来启动一个新项目,也可以将其用于文档管理和培训。他们可能还需要冻结可用来测试、调试和优化不包含生产数据的应用程序的架构。可以通过几种方法来完成这些任务。开发人员可以编写 SQL 语句来创建数据库的备份、从数据库备份中删除所有数据,并通过编写自定义解决方案使用存储过程来获得有关架构的信息。在本文中,我们将讨论 SQL Server? 2000 中隐藏的、未被人们重视的卓越功能中的一个,您可以用它来轻松地创建数据库架构知识库,这个功能就是 Meta Data Services。我们将使用 XML 说明 SQL Server 2000 Meta Data Services 的功能,您可以用它来冻结数据库架构,并将部分已冻结的架构用于其他项目。我们将讨论 Meta Data Services 的组成部分,以及如何使用 Visual Basic? 客户端、XML 和 XSLT 对它们进行编程。我们还要演示一个简单的数据模型,以便说明它的工作原理。c hina it power . c om5EQj32r
SQL Server 2000 Meta Data Services 是一种面向对象的储存库技术,它存储和管理 SQL Server 的元数据及其组件。Meta Data Services 不仅能存储元数据,而且可以与其他工具和应用程序进行集成。它提供了用于存储和管理数据仓库定义、联机分析处理 (OLAP) 定义、开发工具中使用的设计数据以及编程环境中使用的任何其他类型的元数据的解决方案。限于篇幅,本文不可能涵盖 Meta Data Services 提供的所有功能。以下是一些您可以自己研究的功能和服务。c hina it power . c om5EQj32r
广泛支持开放标准 Meta Data Services 支持各种标准,例如,基于 COM 的接口、XML 编码和开放式信息模型 (OIM)。OIM 支持标准元数据。XML 编码支持 OIM 元数据的导入和导出。有关 Meta Data Services 中的 OIM 以及 Meta Data Services 中的 XML 的更多信息,请参阅Ways to Use XML in Meta Data Services。c hina it power . c om5EQj32r
各种信息模型 Meta Data Services 通过 OIM 和其他信息模型支持标准元数据和用户定义的元数据。模型设计人员和程序员可以使用 SDK 来创建基于元数据的应用程序、构建或扩展作为共享元数据基础的信息模型。有关更多信息,请参阅 Meta Data Services SDK。 知识库引擎 Meta Data Services 提供知识库引擎,它在知识库数据库中存储、合并和检索元数据。知识库引擎是作为对象模型提供的,您可以使用 Repository API(知识库 API)来访问它。c hina it power . c om5EQj32r
Repository API 所包括的 Repository API 通过 COM 接口公开知识库引擎功能和信息模型定义。c hina it power . c om5EQj32r
Meta Data Browser 您可以利用该工具来浏览注册的数据库。可以在 SQL Server 2000 中使用该工具,也可以将它作为 Microsoft? 管理控制台 (MMC) 的管理单元使用。有关更多信息,请参阅"Using Meta Data Browser"。c hina it power . c om5EQj32r
您应该已经了解到 Meta Data Services 提供了各种功能,已超出了本文的讨论范围。我们重点讨论知识库数据库的功能以及它们在 SQL Server 2000 中与 XML 的集成。我们还将说明如何使用 Microsoft 开发的组件在知识库数据库中创建、浏览、导入和导出信息。首先,您需要安装Meta Data Services SDK 版本 3.0。安装 SDK 后,您将看到在目录 C:\Program Files\Common Files\Microsoft Shared\Repostry\ 中安装了几个 COM 组件。我们将使用该目录中的某些组件。c hina it power . c om5EQj32r
图 1 转换架构c hina it power . c om5EQj32r
虽然可以通过几种不同的方式来使用 SQL Server 2000 中的 Meta Data Services,但我们讨论的方法是将它的服务作为转换步骤来使用的,以便帮助您创建转换的架构。例如,当您启动一个新项目时,您可能需要现有项目的架构的子集,而不是整个架构。图 1 显示了该方法的概览。接下来的四个小节将说明这个过程中的每个步骤。c hina it power . c om5EQj32r
创建知识库数据库c hina it power . c om5EQj32r
有时,开发人员很希望冻结一个特定版本的数据库的架构。如图 1 所示,应用程序数据模型 1 有许多版本,但我们只需要冻结版本 3。根据我们的方法,应该在此步骤中创建数据库版本 3 的知识库。知识库引擎是一个服务,它提供了存储和检索对象以及维护对象之间的关系的基本功能。在该示例中,数据库架构就是知识库引擎使用的对象。可以通过以下方式创建知识库数据库:使用 Visual Basic 客户端中的 COM 组件 REPODBC.DLL 或使用 SQL Server 2000 中的企业管理器。在本文中,我们将使用企业管理器。c hina it power . c om5EQj32r
导出元数据c hina it power . c om5EQj32r
创建知识库以后,您可以使用 Meta Data Services SDK 提供的 COM 接口通过编写代码访问它,以便将架构作为 XML 导出。SQL Server 2000 Meta Data Services 通过对知识库数据库进行编码来支持 XML,以便用 XML 导入、导出和发布元数据。您还可以在两个知识库数据库之间、在知识库数据库和应用程序之间或者在两个可以解释同一 XML 格式的应用程序之间交换元数据。Meta Data Services 使用 COM 接口来支持使用 XML 导出和导入数据。前面已经提到,我们将使用企业管理器中的 Meta Data Services 来导出数据库的架构。虽然该架构有许多用途,但我们的目标是使用 XSLT将此 XML 转换为 SQL 脚本。c hina it power . c om5EQj32r
转换 XML 文档c hina it power . c om5EQj32r
实质上,这个步骤自动完成创建数据库和新架构的过程。您还可以使用您的自定义 DLL 或第三方工具来转换在图 1 的步骤 2 中创建的 XML,以创建目标数据库。我们使用 XSLT 来转换 Application 2 的架构。我们已经创建了一个到导出的 XML 的转换,导出的 XML 基于存在的 dbm 命名空间。在此示例中,我们的重点是创建可移植 SQL 脚本,它使用一组一般语言属性。c hina it power . c om5EQj32r
应该说明的是,元数据知识库是若干个用于软件设计的信息模型的抽象,其创建基于图 2中列出的、支持 OIM 的模型。c hina it power . c om5EQj32r
因为我们此处的目标是基于数据库模型的属性重新生成数据库模型,所以,为实现这一目标而所做的合理选择是主要处理与数据库架构元素的说明相关的元素。这意味着我们将主要处理 dbm 命名空间中的元素。为此,我们选择了两个基本的数据库元素,利用它们可以重新创建直到某个点的数据库,这两个元素是:表和索引。接着,我们将它们映射到从元素 dbm:DeployedTable 和 dbm:Index 导出的 XML 文档中。为了分隔元信息和数据库本身包含的信息,元数据知识库单独存储每个定义。数据库结构和它使用的数据类型之间的关系关联是使用 ID 来建立的。由于这个原因,当我们从导出的 XML 生成第一个脚本后,它不包含任何特定类型的信息(例如,nvarchar、integer 等),而只包括与其说明相关的 ID。为了生成此数据,我们不得不处理该 XML,并用动态方式来完成它。这意味着,一旦我们定义了脚本的基本布局,那么,我们接下来就需要在转换的页面内填充缺少的部分。为了完成这一即时进行的处理,XSLT 转换创建一个转换的文档,它以一种用户友好的格式提供脚本,在这里,该格式是 HTML。因为 XSLT 转换中的 XPath 表达式可以理解命名空间,并且在这种情况下我们需要匹配其他命名空间中的元素,所以,需要在 XSLT 文件中声明命名空间。综合流程如图 3 所示。c hina it power . c om5EQj32r
c hina it power . c om5EQj32r
图 3 转换流程c hina it power . c om5EQj32r
此文档在生成后是由 HTML 标记帧构成的。在此文档的内部,我们将使用 JavaScript 创建核心文档,该核心文档将创建此文档的最终内容,而且会检索数据库脚本所需的数据类型。这个过程将使用 JavaScript 中的 ADO、通过创建 ActiveX? 对象来完成。一旦我们能够检索到这些内容,我们将动态地写入 HTML 文档以及页面的其他组成部分,以便提供脚本。我们假设 XML 将获得对样式表的引用。这个步骤是在导出的 XML 文件头中通过在行的开头添加以下内容来完成的:c hina it power . c om5EQj32r
从 SQL 脚本创建 SQL 架构c hina it power . c om5EQj32r
在这个步骤中,我们只需执行 SQL 脚本便可在 SQL Server 2000 中创建转换的架构。该 SQL 脚本将自动创建新应用程序 (Application 2) 所需的数据库。执行脚本后,您就可以开始启动新项目了。一旦生成结果产生的文档,您便会看到该文档包含一个用户界面,而脚本就显示在其中的 HTML 标记内。我们可以通过几种方式来使用此脚本。基本上,SQL 脚本的执行取决于用户的喜好,可以通过存储过程、查询处理器或任何其他工具来执行。c hina it power . c om5EQj32r
我们在开始说明示例项目的具体细节之前,还需要讨论一个问题。在启动新项目后,您可能会发现自己是在重复这个过程。也就是说,Application 2 的数据模型可能演变为几个版本,您可能需要冻结其中的一个版本。这一点如图 1 的步骤 5 所示。c hina it power . c om5EQj32r
AppContent 示例c hina it power . c om5EQj32r
我们的示例从图 4 中显示的一个简单的数据模型(名为 AppContent)开始。这是一个典型的 Web 站点的模型,网站上有网页,而且网页上有内容或菜单。每个菜单可以有几个菜单项,它们具有自己的属性。在此示例中,我们将使用图 4 中显示的 Pages 表和 Contents 表启动一个新项目。图 5 显示了企业管理器,其中包括 AppContent 的所有表。c hina it power . c om5EQj32r
c hina it power . c om5EQj32r
图 4数据模型c hina it power . c om5EQj32r
第一个步骤是在 SQL Server 企业管理器中创建知识库。在本地计算机上创建带有以下五个表的 AppContent 数据库 — Pages、Contents、Images、Menu 和 MenuItems。然后配置它们之间的关系,如图 4 所示。定位到企业管理器中的“数据转换服务 | 元数据。右击并选择“导入元数据”。在本地服务器中选择 AppContent 数据库,然后单击“确定”。您会在知识库中看到来自 AppContent 的元数据,如图 6 所示。c hina it power . c om5EQj32r
c hina it power . c om5EQj32r
图 5企业管理器中的表c hina it power . c om5EQj32r
注意,知识库提供了几个有用的功能,例如,跟踪和合并架构的版本,以及数据转换服务 (DTS) 包。在我们的方法中,知识库只是作为一个转换步骤。您可以管理知识库中的架构,还可以使用由 Meta Data Services SDK 3.0 提供的 COM 接口完成许多其他任务。下面的 Visual Basic 代码以编程的方式创建了知识库c hina it power . c om5EQj32r
Public Sub CreateRepository() Dim oRepository As New RepositoryTypeLib.Repository oRepository.Create("SERVER= (local);DATABASE=AppContent","sa","") Set oRepository = Nothing End Sub
RepositoryTypeLib.Repository 是 SDK 中提供的 COM 接口。它还提供了许多其他的方法和功能。我们不可能在本文中说明所有功能,因此建议您自己主动进行研究。当调用 .create 方法时,SQL Server 会在后台创建几个表(前缀是 "RTL")。c hina it power . c om5EQj32r
导出 AppContent 元数据c hina it power . c om5EQj32r
下一个步骤是,创建 AppContent 元数据的 XML 架构。在企业管理器中,定位到“元数据服务 | 内容 | Microsoft数据仓库框架 | OLE DB 数据库架构|您的 SQL Server 机器名称| AppContent”。然后右击选择“导出到 XML”。系统会要求您为导出的文件命名。定位到您要保存该文件的位置,将它命名为 AppContent.XML。文件的内容如图 7所示。前面已经提到,这个 XML 文件包含数据库的详细说明,该文件基于几个支持 OIM 的信息模型(请参阅图 2),其中包括有关每个选中要导出的元素及其子元素的特征的说明。还要注意的是,您可以导出从完整的数据库到任何自描述的元素的所有内容。c hina it power . c om5EQj32r
图 8 显示了以编程方式将知识库从 Visual Basic 客户端导出到 XML 文件所需的代码。(请注意,在实际应用中,您应该避免使用默认的 "sa/no password" 凭据。)该语句c hina it power . c om5EQj32r
Dim objMDExport As MSMDCXMLLib.Export
从 MSMDC (Meta Data Coalition) XML 组件创建导出库,该组件也是 Meta Data Services 的组成部分。同样地,其他对象 — 即 RepositoryTypeLib.RepositoryObject、RepositoryTypeLib.Repository 和 RepositoryTypeLib.ReposRoot — 提供了几个操作知识库的方法。最后,objMDExport.Export 将元数据导出到 XML 文件。(有关 MDC 的更多信息,请参阅OIM in Meta Data Services。)c hina it power . c om5EQj32r
生成 XSLT 来创建 SQL 脚本c hina it power . c om5EQj32r
一旦创建了导出的 XML,应该在文件的开头加入以下代码行,将它与转换相关联:c hina it power . c om5EQj32r
然后使用浏览器打开它。这样,就可以执行 JavaScript,以便填充缺少的参数。c hina it power . c om5EQj32r
然后,我们将脚本创建分为两个部分:XSLT 处理及利用 JavaScript 来生成页面。XSLT 过程通过将相应的模板应用于我们希望作为架构的一部分的每个元素,而对所有元素进行处理 — 在此示例中指表和索引。c hina it power . c om5EQj32r
此时,创建 JavaScript 函数。该脚本执行后,将返回完整的 SQL 语法字符串。这些函数将形成我们的最终结果:能够重新创建从元数据知识库导出的原始数据库(或元素)的 SQL 脚本。这个过程的第一个步骤是根据其他函数来定义所有类型特定的信息(此时我们还不知道这些信息),这些函数将随后在该过程的第二个步骤中检索这些信息。下面是一个从 XML 导出文件中获得的源数据的示例。请注意,其中没有给出显式数据类型信息:c hina it power . c om5EQj32r
<Dbm:DeployedTable oim:id="_2" oim:objid="{{91A6DEB7-0703-4DA4-980E- 9317736AB009},00000091}" oim:label="Contents" name="Contents"> <Uml:ClassifierFeature> <Dbm:DeployedColumn oim:id="_3" oim:objid="{{91A6DEB7-0703- 4DA4-980E-9317736AB009},00000093}" oim:label="PageID" initialValue="0" Ordinal="1" name="PageID" Length="0" OctetLength="0" NumericPrecision="10" NumericScale="0" IsNullable="1"> <Uml:StructuralFeatureType/> </Dbm:DeployedColumn>
下面是一个处理转换的示例:c hina it power . c om5EQj32r
<xsl:template match="Dbm:DeployedTable"> <!-- Checkup to remove previous existence of table objects, if so, then drop them --> document.writeln('DROP TABLE [dbo].[<xsl:value-of select="@name"/>]'); document.writeln('GO\n');
对于第二个脚本创建部分,由转换创建的名为 RetrieveDataTypeStr 的函数从数据库获取数据类型名称,而且该函数也从数据库那里被动态地包含在所生成的 HTML 中。图 9中显示了该函数的核心部分,但一定要对服务器名称、密码和用户名进行替换,以适合您的配置。c hina it power . c om5EQj32r
执行该代码后,会生成图 10中显示的结果。这就是您现在可以复制并粘贴到 SQL Server 2000 查询分析器中的 SQL 脚本。该页上的“提交查询并下载”按钮可以自动运行此脚本,这里我们就不提供该脚本了。只要进行复制和粘贴就可以了。c hina it power . c om5EQj32r
执行 SQL 脚本来创建 SQL Server 架构c hina it power . c om5EQj32r
新架构如图 11 所示。现在您可以开始开发新项目了。创建数据库架构非常简单,因为执行脚本在数据库管理中很常见。由于这个原因,我们在这里不打算详细讨论如何创建或执行 SQL 脚本,而只是想说像查询分析器这样的工具,可以在您需要数据库的任何情况下轻松地完成重新创建数据库的任务。c hina it power . c om5EQj32r
c hina it power . c om5EQj32r
图 11架构c hina it power . c om5EQj32r
除我们本文已经讨论过的功能之外,SQL Server 2000 中的 Meta Data Services 还提供了许多其他功能,例如,DTS 包、元数据版本控制功能以及执行配置管理的功能。除了 Meta Data Services,其他 Microsoft 技术也提供了从现有数据库创建新的应用程序架构的方式。例如,您可以使用 ADO 或 ADO.NET 或者使用 Schema Object Model (SOM) 开发自定义 SQL 脚本,尽管大多数开发人员使用 SQL 脚本和 ADO 来完成此任务。SOM(目前尚未普遍使用)是 MSXML 4.0 SDK 的一部分。此 SDK 提供了一组可定位的类,它们直接反映 W3C XML Schema 定义语言 (XSD) 规范。利用这些类,您可以应用 XML Schema 文档的元素,并通过 Visual Basic 或 Visual C++? 接口获得有关属性、声明以及属性和声明这两者之间关系的信息。c hina it power . c om5EQj32r
在本文中,我们讨论了使用 SQL Server 知识库及其与 XML 的集成来管理元数据的方法。然后,我们使用 XSLT 将 XML 转换为 SQL 脚本,以生成转换的数据库架构。我们特意使用了简单的数据模型来说明我们所讨论的方法,但您也可以将我们的方法应用于较大的数据模型。使用不同的数据模型时,唯一需要进行更改的是 XSLT,以便将 XML 转换为 SQL 脚本。c hina it power . c om5EQj32r
有关相关文章,请参阅:c hina it power . c om5EQj32r
XML in Meta Data Servicesc hina it power . c om5EQj32r
有关背景信息,请参阅:c hina it power . c om5EQj32r
http://www.w3.org/TR/xmlschema-0c hina it power . c om5EQj32r
Meta Data Services Architecturec hina it power . c om5EQj32r
Meta Data Services Software Development Kitc hina it power . c om5EQj32r
Alok Mehta 是 AFS Technologies Inc.(位于马塞诸塞州韦司顿)的首席技术官兼高级副总裁。他在该公司负责技术研发工作。Alok 已经发表了几篇有关基于组件的软件工程和 Web 开发的研究论文。c hina it power . c om5EQj32r
Ricardo Rodriguez目前是 SegurosdeVida.com 的技术总监,拥有系统工程专业的学士学位,并研究电子工程和纯数学。他目前正在哈佛大学攻读信息技术专业的硕士学位。c hina it power . c om5EQj32r
摘自MSDN Magazine 的2003 年 5 月刊。此杂志可通过各地的报摊购买,也可以订阅。c hina it power . c om5EQj32r
http://msdn.microsoft.com/msdn-online/shared/components/ratings/ratings.aspxc hina it power . c om5EQj32r
转到原英文页面c hina it power . c om5EQj32r
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |