在2000中利用MetaDataServices创建架构知识库

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
发布日期:4/1/2004|更新日期:4/1/2004

AlokMehta和RicardoRodriguez

本文假设您熟悉T-SQL、和XSL

LevelofDifficulty123

请下载本文的代码:MetaDataServices.exe(114KB)

摘要SQLServer2000MetaDataServices是一种存储和管理SQLServer的元数据的知识库技术。利用MetaDataServices,您无需反复地构建数据库架构,就可以冻结整个架构,以便在其他项目中使用。您还可以将这些架构用于培训、测试或调试。我们将在本文中讨论MetaDataServices的多个组件,说明如何使用客户端、XML和对其进行。我们还会说明如何通过使用SQLServer知识库生成简单的数据库架构来管理和操作您的元数据。

元数据可以说是无处不在。它是数据库架构、对象模型、项目说明、文件制作、交叉引用、可重用组件、/配置、业务规则和知识库的一个组成部分。虽然元数据很常见,但用于管理它的工具和方法却很少。在许多情况下,开发人员发现他们自己在为各种不同的项目重复地和实现类似的数据库架构。而且,当应用程序在生产环境中使用时,开发人员常常需要冻结没有数据的数据库架构版本,这样他们就可以将冻结的架构用于其他目的。开发人员可以使用全部冻结或部分冻结的架构来启动一个新项目,也可以将其用于文档管理和培训。他们可能还需要冻结可用来测试、调试和优化不包含生产数据的应用程序的架构。可以通过几种方法来完成这些任务。开发人员可以编写SQL语句来创建数据库的备份、从数据库备份中删除所有数据,并通过编写自定义解决方案使用存储过程来获得有关架构的信息。在本文中,我们将讨论SQLServer?2000中隐藏的、未被人们重视的卓越功能中的一个,您可以用它来轻松地创建数据库架构知识库,这个功能就是MetaDataServices。我们将使用XML说明SQLServer2000MetaDataServices的功能,您可以用它来冻结数据库架构,并将部分已冻结的架构用于其他项目。我们将讨论MetaDataServices的组成部分,以及如何使用VisualBasic?客户端、XML和XSLT对它们进行编程。我们还要演示一个简单的数据模型,以便说明它的工作原理。

入门

SQLServer2000MetaDataServices是一种面向对象的储存库技术,它存储和管理SQLServer的元数据及其组件。MetaDataServices不仅能存储元数据,而且可以与其他工具和应用程序进行集成。它提供了用于存储和管理数据仓库定义、联机分析处理(OLAP)定义、开发工具中使用的设计数据以及编程环境中使用的任何其他类型的元数据的解决方案。限于篇幅,本文不可能涵盖MetaDataServices提供的所有功能。以下是一些您可以自己研究的功能和服务。

广泛支持开放标准MetaDataServices支持各种标准,例如,基于COM的接口、XML编码和开放式信息模型(OIM)。OIM支持标准元数据。XML编码支持OIM元数据的导入和导出。有关MetaDataServices中的OIM以及MetaDataServices中的XML的更多信息,请参阅WaystoUseXMLinMetaDataServices。

各种信息模型MetaDataServices通过OIM和其他信息模型支持标准元数据和用户定义的元数据。模型设计人员和程序员可以使用SDK来创建基于元数据的应用程序、构建或扩展作为共享元数据基础的信息模型。有关更多信息,请参阅MetaDataServicesSDK。知识库引擎MetaDataServices提供知识库引擎,它在知识库数据库中存储、合并和检索元数据。知识库引擎是作为对象模型提供的,您可以使用RepositoryAPI(知识库API)来访问它。

RepositoryAPI所包括的RepositoryAPI通过COM接口公开知识库引擎功能和信息模型定义。

MetaDataBrowser您可以利用该工具来浏览注册的数据库。可以在SQLServer2000中使用该工具,也可以将它作为Microsoft?管理控制台(MMC)的管理单元使用。有关更多信息,请参阅"UsingMetaDataBrowser"。

您应该已经了解到MetaDataServices提供了各种功能,已超出了本文的讨论范围。我们重点讨论知识库数据库的功能以及它们在SQLServer2000中与XML的集成。我们还将说明如何使用Microsoft开发的组件在知识库数据库中创建、浏览、导入和导出信息。首先,您需要安装MetaDataServicesSDK版本3.0。安装SDK后,您将看到在目录C:/ProgramFiles/CommonFiles/MicrosoftShared/Repostry/中安装了几个COM组件。我们将使用该目录中的某些组件。


图1转换架构 

虽然可以通过几种不同的方式来使用SQLServer2000中的MetaDataServices,但我们讨论的方法是将它的服务作为转换步骤来使用的,以便帮助您创建转换的架构。例如,当您启动一个新项目时,您可能需要现有项目的架构的子集,而不是整个架构。图1显示了该方法的概览。接下来的四个小节将说明这个过程中的每个步骤。

创建知识库数据库

有时,开发人员很希望冻结一个特定版本的数据库的架构。如图1所示,应用程序数据模型1有许多版本,但我们只需要冻结版本3。根据我们的方法,应该在此步骤中创建数据库版本3的知识库。知识库引擎是一个服务,它提供了存储和检索对象以及维护对象之间的关系的基本功能。在该示例中,数据库架构就是知识库引擎使用的对象。可以通过以下方式创建知识库数据库:使用VisualBasic客户端中的COM组件REPODBC.DLL或使用SQLServer2000中的企业管理器。在本文中,我们将使用企业管理器。

导出元数据

创建知识库以后,您可以使用MetaDataServicesSDK提供的COM接口通过编写代码访问它,以便将架构作为XML导出。SQLServer2000MetaDataServices通过对知识库数据库进行编码来支持XML,以便用XML导入、导出和发布元数据。您还可以在两个知识库数据库之间、在知识库数据库和应用程序之间或者在两个可以解释同一XML格式的应用程序之间交换元数据。MetaDataServices使用COM接口来支持使用XML导出和导入数据。前面已经提到,我们将使用企业管理器中的MetaDataServices来导出数据库的架构。虽然该架构有许多用途,但我们的目标是使用XSLT将此XML转换为SQL脚本。

转换XML文档

实质上,这个步骤自动完成创建数据库和新架构的过程。您还可以使用您的自定义DLL或第三方工具来转换在图1的步骤2中创建的XML,以创建目标数据库。我们使用XSLT来转换Application2的架构。我们已经创建了一个到导出的XML的转换,导出的XML基于存在的dbm命名空间。在此示例中,我们的重点是创建可移植SQL脚本,它使用一组一般语言属性。

应该说明的是,元数据知识库是若干个用于软件设计的信息模型的抽象,其创建基于图2中列出的、支持OIM的模型。

因为我们此处的目标是基于数据库模型的属性重新生成数据库模型,所以,为实现这一目标而所做的合理选择是主要处理与数据库架构元素的说明相关的元素。这意味着我们将主要处理dbm命名空间中的元素。为此,我们选择了两个基本的数据库元素,利用它们可以重新创建直到某个点的数据库,这两个元素是:表和索引。接着,我们将它们映射到从元素dbm:DeployedTable和dbm:Index导出的XML文档中。为了分隔元信息和数据库本身包含的信息,元数据知识库单独存储每个定义。数据库结构和它使用的数据类型之间的关系关联是使用ID来建立的。由于这个原因,当我们从导出的XML生成第一个脚本后,它不包含任何特定类型的信息(例如,nvarchar、integer等),而只包括与其说明相关的ID。为了生成此数据,我们不得不处理该XML,并用动态方式来完成它。这意味着,一旦我们定义了脚本的基本布局,那么,我们接下来就需要在转换的页面内填充缺少的部分。为了完成这一即时进行的处理,XSLT转换创建一个转换的文档,它以一种用户友好的格式提供脚本,在这里,该格式是。因为XSLT转换中的XPath表达式可以理解命名空间,并且在这种情况下我们需要匹配其他命名空间中的元素,所以,需要在XSLT文件中声明命名空间。综合流程如图3所示。


  

3转换流程

此文档在生成后是由HTML标记帧构成的。在此文档的内部,我们将使用创建核心文档,该核心文档将创建此文档的最终内容,而且会检索数据库脚本所需的数据类型。这个过程将使用Script中的ADO、通过创建ActiveX?对象来完成。一旦我们能够检索到这些内容,我们将动态地写入HTML文档以及页面的其他组成部分,以便提供脚本。我们假设XML将获得对样式表的引用。这个步骤是在导出的XML文件头中通过在行的开头添加以下内容来完成的:

SQL脚本创建SQL架构

在这个步骤中,我们只需执行SQL脚本便可在SQLServer2000中创建转换的架构。该SQL脚本将自动创建新应用程序(Application2)所需的数据库。执行脚本后,您就可以开始启动新项目了。一旦生成结果产生的文档,您便会看到该文档包含一个用户界面,而脚本就显示在其中的HTML标记内。我们可以通过几种方式来使用此脚本。基本上,SQL脚本的执行取决于用户的喜好,可以通过存储过程、查询处理器或任何其他工具来执行。

我们在开始说明示例项目的具体细节之前,还需要讨论一个问题。在启动新项目后,您可能会发现自己是在重复这个过程。也就是说,Application2的数据模型可能演变为几个版本,您可能需要冻结其中的一个版本。这一点如图1的步骤5所示。

AppContent示例

我们的示例从图4中显示的一个简单的数据模型(名为AppContent)开始。这是一个典型的Web站点的模型,上有网页,而且网页上有内容或菜单。每个菜单可以有几个菜单项,它们具有自己的属性。在此示例中,我们将使用图4中显示的Pages表和Contents表启动一个新项目。图5显示了企业管理器,其中包括AppContent的所有表。


  

4数据模型

第一个步骤是在SQLServer企业管理器中创建知识库。在本地计算机上创建带有以下五个表的AppContent数据库—Pages、Contents、Images、Menu和MenuItems。然后配置它们之间的关系,如图4所示。定位到企业管理器中的“数据转换服务|元数据。右击并选择“导入元数据”。在本地服务器中选择AppContent数据库,然后单击“确定”。您会在知识库中看到来自AppContent的元数据,如图6所示。


  

5企业管理器中的表

注意,知识库提供了几个有用的功能,例如,跟踪和合并架构的版本,以及数据转换服务(DTS)包。在我们的方法中,知识库只是作为一个转换步骤。您可以管理知识库中的架构,还可以使用由MetaDataServicesSDK3.0提供的COM接口完成许多其他任务。下面的VisualBasic代码以编程的方式创建了知识库

PublicSubCreateRepository()DimoRepositoryAsNewRepositoryTypeLib.RepositoryoRepository.Create("SERVER=(local);DATABASE=AppContent","sa","")SetoRepository=NothingEndSub

RepositoryTypeLib.Repository是SDK中提供的COM接口。它还提供了许多其他的方法和功能。我们不可能在本文中说明所有功能,因此建议您自己主动进行研究。当调用.create方法时,SQLServer会在后台创建几个表(前缀是"RTL")。

导出AppContent元数据

下一个步骤是,创建AppContent元数据的XML架构。在企业管理器中,定位到“元数据服务|内容|Microsoft数据仓库框架|OLEDB数据库架构|您的SQLServer机器名称|AppContent”。然后右击选择“导出到XML”。系统会要求您为导出的文件命名。定位到您要保存该文件的位置,将它命名为AppContent.XML。文件的内容如图7所示。前面已经提到,这个XML文件包含数据库的详细说明,该文件基于几个支持OIM的信息模型(请参阅图2),其中包括有关每个选中要导出的元素及其子元素的特征的说明。还要注意的是,您可以导出从完整的数据库到任何自描述的元素的所有内容。

图8显示了以编程方式将知识库从VisualBasic客户端导出到XML文件所需的代码。(请注意,在实际应用中,您应该避免使用默认的"sa/nopassword"凭据。)该语句

DimobjMDExportAsMSMDCXMLLib.Export

从MSMDC(MetaDataCoalition)XML组件创建导出库,该组件也是MetaDataServices的组成部分。同样地,其他对象—即RepositoryTypeLib.RepositoryObject、RepositoryTypeLib.Repository和RepositoryTypeLib.ReposRoot—提供了几个操作知识库的方法。最后,objMDExport.Export将元数据导出到XML文件。(有关MDC的更多信息,请参阅OIMinMetaDataServices。)

生成XSLT来创建SQL脚本

一旦创建了导出的XML,应该在文件的开头加入以下代码行,将它与转换相关联:

然后使用浏览器打开它。这样,就可以执行JavaScript,以便填充缺少的参数。

然后,我们将脚本创建分为两个部分:XSLT处理及利用JavaScript来生成页面。XSLT过程通过将相应的模板应用于我们希望作为架构的一部分的每个元素,而对所有元素进行处理—在此示例中指表和索引。

此时,创建JavaScript函数。该脚本执行后,将返回完整的SQL语法字符串。这些函数将形成我们的最终结果:能够重新创建从元数据知识库导出的原始数据库(或元素)的SQL脚本。这个过程的第一个步骤是根据其他函数来定义所有类型特定的信息(此时我们还不知道这些信息),这些函数将随后在该过程的第二个步骤中检索这些信息。下面是一个从XML导出文件中获得的源数据的示例。请注意,其中没有给出显式数据类型信息:

<Dbm:DeployedTableoim:id="_2"oim:objid="{{91A6DEB7-0703-4DA4-980E-9317736AB009},00000091}"oim:label="Contents"name="Contents"><Uml:ClassifierFeature><Dbm:DeployedColumnoim: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>

下面是一个处理转换的示例:

<xsl:templatematch="Dbm:DeployedTable"><!--Checkuptoremovepreviousexistenceoftableobjects,ifso,thendropthem-->document.writeln('DROPTABLE[dbo].[<xsl:value-ofselect="@name"/>]');document.writeln('GO/n');

对于第二个脚本创建部分,由转换创建的名为RetrieveDataTypeStr的函数从数据库获取数据类型名称,而且该函数也从数据库那里被动态地包含在所生成的HTML中。图9中显示了该函数的核心部分,但一定要对服务器名称、密码和用户名进行替换,以适合您的配置。

执行该代码后,会生成图10中显示的结果。这就是您现在可以复制并粘贴到SQLServer2000查询分析器中的SQL脚本。该页上的“提交查询并下载”按钮可以自动运行此脚本,这里我们就不提供该脚本了。只要进行复制和粘贴就可以了。

执行SQL脚本来创建SQLServer架构

新架构如图11所示。现在您可以开始开发新项目了。创建数据库架构非常简单,因为执行脚本在数据库管理中很常见。由于这个原因,我们在这里不打算详细讨论如何创建或执行SQL脚本,而只是想说像查询分析器这样的工具,可以在您需要数据库的任何情况下轻松地完成重新创建数据库的任务。


  

11架构

返回页首

结论

除我们本文已经讨论过的功能之外,SQLServer2000中的MetaDataServices还提供了许多其他功能,例如,DTS包、元数据版本控制功能以及执行配置管理的功能。除了MetaDataServices,其他Microsoft技术也提供了从现有数据库创建新的应用程序架构的方式。例如,您可以使用ADO或或者使用SchemaObjectModel(SOM)开发自定义SQL脚本,尽管大多数开发人员使用SQL脚本和ADO来完成此任务。SOM(目前尚未普遍使用)是MSXML4.0SDK的一部分。此SDK提供了一组可定位的类,它们直接反映W3CXMLSchema定义语言(XSD)规范。利用这些类,您可以应用XMLSchema文档的元素,并通过VisualBasic或?接口获得有关属性、声明以及属性和声明这两者之间关系的信息。

在本文中,我们讨论了使用SQLServer知识库及其与XML的集成来管理元数据的方法。然后,我们使用XSLT将XML转换为SQL脚本,以生成转换的数据库架构。我们特意使用了简单的数据模型来说明我们所讨论的方法,但您也可以将我们的方法应用于较大的数据模型。使用不同的数据模型时,唯一需要进行更改的是XSLT,以便将XML转换为SQL脚本。

返回页首

参考文献

有关相关文章,请参阅:

XMLinMetaDataServices

有关背景信息,请参阅:

http://www.w3.org/TR/xmlschema-0

MetaDataServicesArchitecture

MetaDataServicesSoftwareDevelopmentKit

AlokMehta是AFSTechnologiesInc.(位于马塞诸塞州韦司顿)的首席技术官兼高级副总裁。他在该公司负责技术研发工作。Alok已经发表了几篇有关基于组件的和Web开发的研究论文。

RicardoRodriguez目前是SegurosdeVida.com的技术总监,拥有系统工程专业的学士学位,并研究电子工程和纯数学。他目前正在哈佛大学攻读信息技术专业的硕士学位。

摘自MSDNMagazine的2003年5月刊。此杂志可通过各地的报摊购买,也可以订阅。

http://msdn.microsoft.com/msdn-online/shared/components/ratings/ratings.aspx

转到原英文页面

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭