概述 (SMO)

SQL Server 管理对象 (SMO) 是针对 Microsoft SQL Server 的编程管理设计的对象。可以使用 SMO 生成自定义 SQL Server 管理应用程序。尽管 SQL Server Management Studio 是用于管理 SQL Server 的使用广泛的强大应用程序,但有时 SMO 应用程序可能对您更为适用。

例如,可能需要简化控制 SQL Server 管理任务的用户应用程序,以满足新用户的需要并且降低培训成本。您可能需要创建自定义 SQL Server 数据库,或创建用于创建和监控索引效率的应用程序。还可以使用 SMO 应用程序将第三方硬件或软件无缝纳入数据库管理应用程序。

SMO 对象模型扩展并取代了分布式管理对象 (SQL-DMO) 对象模型。与 SQL-DMO 相比,SMO 提高了性能、加强了控制,并且更易于使用。SMO 中包括大部分 SQL-DMO 功能,并且还有很多新类用于支持 SQL Server 中的新增功能。该对象模型直观明了,并且尽量使用 SQL-DMO 术语,以帮助您进行技能过渡。

由于 SMO 与 SQL Server 2000、SQL Server 2005、SQL Server 2008 和 SQL Server 2008 R2 兼容,您可以轻松管理多版本环境。

重要说明重要提示

SMO 不支持兼容级别 60、65 或 70。如果将 SMO 用于兼容级别设置为 60、65 或 70 的数据库,则无法使用 SMO 管理该数据库。

SMO 中新增了以下功能:

  • 创建缓存对象模型和优化的对象实例。仅在专门引用时才加载对象。创建对象时仅部分加载对象属性。其余对象和属性在直接引用时加载。

  • 成批执行 Transact-SQL 语句。对语句执行批处理以提高网络性能。

  • 捕获 Transact-SQL 语句。允许将任意操作捕获到脚本中。Management Studio 使用此功能编写操作脚本而不是立即执行该操作。

  • 通过 WMI 提供程序管理 SQL Server 服务。可以通过编程方式启动、停止和暂停 SQL Server 服务。

  • 高级脚本编写。可以生成 Transact-SQL 脚本以重新创建描述与 SQL Server 实例上的其他对象之间的关系的 SQL Server 对象。

  • 使用唯一资源名称 (URN)。URN 允许您创建 SMO 对象的实例并引用 SMO 对象。

SMO 还表示为 SQL Server 2005 中引入的许多功能和组件中的新对象或属性。这些新增的功能和组件包括:

SMO 命名空间为 Microsoft.SqlServer.Management.Smo。SMO 作为 Microsoft .NET Framework 程序集实现。这意味着使用 SMO 对象之前必须先安装 Microsoft .NET Framework 版本 2.0 中的公共语言运行时。SMO 程序集随 SQL Server SDK 选件默认安装到全局程序集缓存 (GAC) 中。这些程序集位于 C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\ 中。有关详细信息,请参阅 Visual Studio .NET Framework 文档。

SMO 类

SMO 类包括两个类别:实例类和实用工具类。

实例类

实例类表示 SQL Server 对象,如服务器、数据库、表、触发器和存储过程。ServerConnection 类用于与 SQL Server 实例建立连接,并且控制发送到它的命令的捕获模式。

SMO 实例对象所构成的层次结构代表了数据库服务器的层次结构。顶部为 SQL Server 实例,其下为数据库,再下面是表、列、触发器等。如果存在一个父级对多个子级的关系(如某个表具有一个或多个列)是符合逻辑的,那么子级将由对象集合来表示。否则子级仅由对象来表示。

实用工具类

实用工具类是为执行特定任务而显式创建的一组对象。根据功能将它们划分为不同的对象层次结构:

  • 传输类。用于向其他数据库传输架构和数据。

  • 备份和还原类。用于备份和还原数据库。

  • 脚本程序类。用于创建脚本文件,以重新生成对象及其依赖关系。

新增的 SMO 功能

优化性能

在 SQL-DMO 中,对象枚举要求集合内的每个对象都完全实例化,这会占用网络和内存空间,导致效率低下。多数情况下,可以将对象实例化,而无需显式引用该对象的多数属性。

SMO 体系结构就内存占用而言更为有效,因为对象最初只是部分实例化,所以只从服务器请求尽量少的属性信息;直到显式引用对象时才将对象完全实例化。当请求在最初检索的属性集中不存在的某个属性或者调用的方法需要这样的属性时,才将对象完全实例化。从部分实例化对象到完全实例化对象的转换对用户是透明的。此外,从不检索某些占用大量内存空间的属性,除非显式引用该属性。Database 对象属性的 Size 属性就是这样的例子。不过,部分实例化确实需要更多的网络往返时间,所以可能对您的应用程序而言不是最佳执行选项。

您可以对实例化进行控制以适应系统环境。尽管依赖延迟实例化可能在引用属性时触发许多服务器请求,但它将应用程序所需的内存空间降至最低。

实例类(表示实际数据库对象的对象)可存在三种级别的实例化,分别是:最小实例化(在一个块中仅读取尽量少的必需属性)、部分实例化(在一个块中读取占用相对较大的内存空间的所有属性),以及完全实例化。非实例化和完全实例化是两种传统的实例化状态。由于部分实例化对象不包含完整对象属性集的值,所以部分实例化提高了效率。部分实例化是未直接引用的对象的默认状态。引用这些属性之一时,将生成错误,提示需要将对象完全实例化。

捕获执行

直接执行是通常的执行方法。语句一旦引发,就会直接发送到 SQL Server 的某个实例。捕获执行是直接执行的替代方式。

捕获执行允许您捕获通常会执行的 Transact-SQL 批处理。这使 SMO 编程人员得以延迟脚本、存储它以便以后执行,或者为最终用户提供预览。例如,可以将 create database、create table 和 create index 语句发送在一个批处理中,随后作为三个先后步骤运行。用户可以通过使用 Server 对象控制此功能。

WMI 提供程序

WMI 提供程序对象由 SMO 包装。这为 SMO 编程人员提供了与 SMO 类极为相似的简单对象模型,而无需了解命名空间所表示的编程模型以及 SQL Server WMI 提供程序的详细信息。WMI 提供程序支持您配置 SQL Server 服务、别名以及客户端和服务器网络库。

编写脚本

在 SMO 中,脚本编写功能得到了增强,且已移入 Scripter 类。可以使用 Scripter 类发现依赖关系、了解对象之间的关系,并支持对依赖关系层次结构进行操作。主要的脚本编写对象为 Scripter 对象。还有若干支持对象用于处理依赖关系并响应进度或错误事件。

Scripter 对象支持以下高级脚本编写选项:

  • 1 段式简单脚本编写(在一步中创建脚本)

  • 3 段式高级脚本编写(在三步中创建脚本;发现依赖关系、生成列表、生成脚本)

  • 双向依赖关系发现(允许发现依赖关系或依赖项)

  • 响应进度事件

  • 响应错误事件

唯一资源名称

使用 SMO 对象库时的一个关键概念是唯一资源名称 (URN)。URN 使用类似于 XPath 的语法。XPath 是一种用于指定对象的层次结构路径,该路径中的每个级别都具有限定符和函数。在 SMO 中,URN 具有两个元素:路径和属性命名(功能有限)。路径用于指定对象的位置,属性命名支持一定程度的筛选。

针对数据库的 URN 的示例如下:

/Server/Database[@Name='Adventureworks2008R2']

可以通过引用对象的 URN 属性来检索该对象的 URN。Scripter 对象也将 URN 用作参数,用于将对象引用传递给 Scripter 对象的方法。此外,可以为 Server 对象的 GetSmoObject(Urn) 方法指定 URN,用于创建 SMO 对象的实例。

用 SMO 表示的 SQL Server 新增功能

表和索引分区

索引表分区支持您管理跨多个文件组的表和索引中的数据的分布。此新增功能由 SMO 对象表示。

端点

SOAP 和数据库镜像请求通过使用 Endpoint 对象由端点处理。

快照隔离/行级版本控制

快照隔离级别(行级版本控制)由新的 Database 对象属性表示。

XML 架构命名空间、XML 索引和 XML 数据类型

XML 架构命名空间在 SMO 中通过对象集合来表示。XML 索引在 SMO 中通过 Index 对象属性来表示。

全文搜索增强功能

SMO 中提供了新对象,这些对象表示针对全文搜索的增强。

页验证

PageVerify 对象表示数据库页验证选项。

快照数据库

快照数据库是特定时间点的指定数据库的只读副本。可以通过使用 Database 对象的 IsDatabaseSnapshot 属性指定快照数据库。

Service Broker

Service Broker 及其功能由一组对象表示

索引增强功能

SQL Server 索引增强功能由 Index 对象中的新增属性表示。

SMO 和 SQL-DMO

SMO 对象模型取代了 SQL-DMO。SMO 支持 SQL Server 2000、SQL Server 2005、SQL Server 2008 和 SQL Server 2008 R2。它支持更多 SQL Server 管理任务并包含 SQL Server 中的许多新功能。SMO 设计用于提高效率和加强控制。

DMO 库是一个 COM 对象模型,而 SMO 作为 .NET Framework 程序集实现。COM 组件是一些库,这些库向应用程序提供可重用的功能并且采用非托管应用程序编程方式。.NET Framework 程序集提供可重用功能,供 .NET Framework 编写托管代码应用程序。

向 .NET Framework 技术过渡的过程中,编写应用程序可采用部分托管代码和部分非托管代码。.NET Framework 支持与 COM 组件建立接口连接,这需要一个主互操作程序集。SQL-DMO 需要运行时包装,以便从基于 .NET Framework 的应用程序进行调用。