概述 (SMO)
适用于:SQL Server Azure SQL 数据库 azure Synapse Analytics Azure SQL 托管实例
SQL Server 管理对象(SMO)是旨在以编程方式管理 Microsoft SQL Server 的对象。 可以使用 SMO 生成自定义的 SQL Server 管理应用程序。 尽管 SQL Server Management Studio 是用于管理 SQL Server 的强大且广泛的应用程序,但有时 SMO 应用程序可以更好地提供服务。
例如,控制 SQL Server 管理任务的用户应用程序可能需要简化,以满足新用户的需求并降低培训成本。 可能需要创建自定义 SQL Server 数据库,或者创建应用程序以创建和监视索引的效率。 还可以使用 SMO 应用程序将第三方硬件或软件无缝纳入数据库管理应用程序。
由于 SMO 与 SQL Server 2005(9.x)及更高版本兼容,因此可以轻松管理多版本环境。
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(9.x)中引入的许多功能和组件的新对象或属性。 这些新增的功能和组件包括:
用于在分区方案上存储数据的表和索引分区。 有关详细信息,请参阅 Partitioned Tables and Indexes。
用于管理 SOAP 请求的 HTTP 端点。 有关详细信息,请参阅 “实现终结点”。
旨在提高并发性的快照隔离和行级版本控制。 有关详细信息,请参阅使用快照隔离。
XML 架构集合、XML 索引和 XML 数据类型提供 XML 数据的验证和存储。 有关详细信息,请参阅 XML 架构集合(SQL Server) 和使用 XML 架构。
用于创建数据库只读副本的快照数据库。
Service Broker 支持基于消息的通信。 有关详细信息,请参阅 SQL Server Service Broker。
对 SQL Server 数据库对象的多个名称的同义词支持。 有关详细信息,请参阅同义词(数据库引擎)。
通过管理数据库邮件,可以在 SQL Server 中创建电子邮件服务器、电子邮件配置文件和电子邮件帐户。 有关详细信息,请参阅数据库邮件。
用于注册连接信息的已注册服务器支持。 有关详细信息,请参阅 “注册服务器”。
跟踪和重播 SQL Server 事件。 有关详细信息,请参阅 SQL Server Profiler、 SQL 跟踪、 SQL Server Distributed Replay 和 扩展事件。
针对用于安全控制的证书和密钥的支持。 有关详细信息,请参阅 加密层次结构。
用于在出现 DDL 事件时增强功能的 DDL 触发器。 有关详细信息,请参阅 DDL Triggers。
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\130\SDK\Assemblies 中。 有关详细信息,请参阅 Visual Studio .NET Framework 文档。
SMO 类
SMO 类包括两个类别:实例类和实用工具类。
实例类
实例类表示 SQL Server 对象,例如服务器、数据库、表、触发器和存储过程。 该 ServerConnection 类用于建立与 SQL Server 实例的连接,并控制发送到它的命令的捕获模式。
SMO 实例对象所构成的层次结构代表了数据库服务器的层次结构。 顶部是 SQL Server 的实例,这些实例是数据库,接下来是表、列、触发器等。 如果存在一个父级对多个子级的关系(如某个表具有一个或多个列)是符合逻辑的,那么子级将由对象集合来表示。 否则,子级由一个对象表示。
实用工具类
实用工具类是为执行特定任务而显式创建的一组对象。 根据功能将它们划分为不同的对象层次结构:
传输类。 用于向其他数据库传输架构和数据。
备份和还原类。 用于备份和还原数据库。
脚本程序类。 用于创建脚本文件,以重新生成对象及其依赖关系。
SMO 功能
优化性能
SMO 体系结构在内存方面非常有效,因为对象最初只是部分实例化,并且从服务器请求最少的属性信息。 直到显式引用对象时才将对象完全实例化。 当请求在最初检索的属性集中不存在的某个属性或者调用的方法需要这样的属性时,才将对象完全实例化。 从部分实例化对象到完全实例化对象的转换对用户是透明的。 此外,从不检索某些占用大量内存空间的属性,除非显式引用该属性。 例如, Size 对象属性的属性 Database 。 不过,部分实例化确实需要更多的网络往返时间,所以可能对您的应用程序而言不是最佳执行选项。
您可以对实例化进行控制以适应系统环境。 尽管依赖延迟实例化可能在引用属性时触发许多服务器请求,但它将应用程序所需的内存空间降至最低。
实例类(表示实际数据库对象的对象)可存在三种级别的实例化, 分别是:最小实例化(在一个块中仅读取尽量少的必需属性)、部分实例化(在一个块中读取占用相对较大的内存空间的所有属性),以及完全实例化。 未经证实和完全实例化是实例化的传统状态。 由于部分实例化对象不包含完整对象属性集的值,所以部分实例化提高了效率。 部分实例化是未直接引用的对象的默认状态。 引用这些属性之一时,将生成错误,提示需要将对象完全实例化。
捕获执行
直接执行是通常的执行方法。 语句将直接发送到 SQL Server 实例,因为它们是产生的。 捕获执行是直接执行的替代方式。
通过捕获执行,可以捕获通常要执行的 Transact-SQL 批处理。 这使 SMO 编程人员得以延迟脚本、存储它以便以后执行,或者为最终用户提供预览。 例如, 可以在一个批处理中发送创建数据库、 创建表和 创建索引 语句,然后按三个顺序步骤运行。 用户可以通过使用 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='AdventureWorks2022']
可以通过引用对象的 URN 属性来检索该对象的 URN。 Scripter 对象还使用 URN 作为参数,这些参数将对象引用传递给 Scripter 对象的方法。 此外,可以为 Server 对象的 GetSmoObject 方法指定 URN。 用于创建 SMO 对象的实例。
SMO 中表示的 SQL Server 功能
表和索引分区
索引表分区支持您管理跨多个文件组的表和索引中的数据的分布。 此新增功能由 SMO 对象表示。
端点
SOAP 和数据库镜像请求通过使用 Endpoint 对象由端点处理。
快照隔离/行级别版本控制
快照隔离级别(行级版本控制)由新的 Database 对象属性表示。
XML 架构命名空间、XML 索引和 XML 数据类型
XML 架构命名空间在 SMO 中通过对象集合来表示。 XML 索引通过 Index 对象属性在 SMO 中表示。
全文搜索增强功能
SMO 中提供了新对象,这些对象表示针对全文搜索的增强。
页验证
PageVerify 对象表示数据库页验证选项。
快照数据库
快照数据库是特定时间点的指定数据库的只读副本。 可以通过使用 IsDatabaseSnapshot 对象的 Database 属性指定快照数据库。
Service Broker
Service Broker 及其功能由一组对象表示
索引增强功能
SQL Server 索引增强功能由对象中的 Index 新属性表示。