SMO 教程第 4 部分 - 数据传输和跟踪






4.88/5 (44投票s)
在本教程的第四部分,我将向您展示如何使用SMO传输对象和捕获跟踪消息。
- 下载 SMODataTransfer_GUI_bin.zip - 27.78 KB
- 下载 SMODataTransfer_GUI_src.zip - 100.3 KB
- 下载 SQLServerTracing_GUI_bin.zip - 25.84 KB
- 下载 SQLServerTracing_GUI_src.zip - 108 KB
引言
去年我开始撰写有关SMO的文章。在第一篇文章中,我介绍了服务器管理对象是什么。我展示了如何处理数据库存储对象。在第二篇文章中,我描述了如何使用与数据库存储对象无关的类。在第三篇文章中,我描述了SMO的脚本功能。在本文中,我将演示如何传输数据库之间的数据以及如何跟踪事件。
传输数据
有时开发人员需要将数据从一个数据库传输到另一个数据库。解决这个问题有很多方法。您可以移动/复制数据库,从旧服务器分离数据库并将其附加到新服务器,或者备份数据库并在新服务器上恢复它,或者您可以创建自己的应用程序来在新服务器上传输数据库。本文将介绍最后一种方法。
要完成此任务,您需要使用Transfer类。此类是一个实用类,提供了传输对象的工具。
数据库模式中的对象是通过在目标服务器上执行生成的脚本来传输的。表数据是通过动态创建的DTS包传输的。此类位于Microsoft.SqlServer.Management.Smo
命名空间中。
static void Main(string[] args)
{
ServerConnection conn = new ServerConnection(@"posta","kanasz","chaaron");
try
{
Server server = new Server(conn);
Database db = server.Databases["ApplicationErrors"];
Transfer t = new Transfer(db);
t.CopyAllTables= true;
t.Options.WithDependencies = true;
t.DestinationServer = @"ANANAS\ANANAS2009";
t.DestinationLogin = "kanasz";
t.DestinationPassword = "chaaron";
t.DestinationDatabase = "ApplicationErrors";
t.CreateTargetDatabase = true;
t.CopyData= true;
t.DataTransferEvent +=new DataTransferEventHandler(DataTransferEvent_Handler);
t.DiscoveryProgress +=new ProgressReportEventHandler(DiscoveryProgress_Handler);
t.TransferData();
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
catch (Exception err)
{
Console.WriteLine("ERROR:" + err.Message);
}
}
protected static void DiscoveryProgress_Handler
(object sender, ProgressReportEventArgs e
)
{
Console.WriteLine(e.Total + "/" + e.TotalCount + " " + e.Current.Value);
}
protected static void DataTransferEvent_Handler(
object sender, DataTransferEventArgs e)
{
Console.WriteLine("[" + e.DataTransferEventType + "] " + e.Message);
}

上一个示例演示了如何将数据库从一个数据库服务器传输到另一个数据库服务器。设置了8个属性来配置传输对象。
CopyAllTables
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server表从源数据库复制到目标数据库。Options
,表示脚本选项对象,该对象提供可为脚本操作设置的编程选项。其属性WithDependencies是属性值,指定是否在生成的脚本中包含所有依赖对象。DestinationServer
,表示拥有目标数据库的SQL Server实例。DestinationLogin
,获取或设置目标数据库所属的SQL Server实例的登录名。DestinationPassword
,获取或设置目标数据库所属的SQL Server实例的登录密码。DestinationDatabase
,获取或设置传输操作的目标数据库。CreateTargetDatabase
,获取或设置一个布尔属性值,该值指定在传输操作中是否创建目标数据库。CopyData
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有数据从源数据库复制到目标数据库。
DataTransferEvent
,报告数据已传输。使用此事件,您可以获取有关当前执行脚本的信息。DataDiscoveryEvent
,报告发现过程的进度。
另一个例子
以下示例演示了如何使用Transfer类的更多选项。此示例允许您将数据从一个SQL数据库服务器传输到另一个。此外,它还允许您生成传输脚本并使用更多的传输和生成选项。
此示例的主窗体包含三个选项卡。在第一个选项卡中,您可以选择数据库服务器并为其设置登录凭据。

在第二部分中,您可以选择传输选项。
Copy All Db Triggers
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server数据库触发器从源数据库复制到目标数据库。Copy All Defaults
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server默认值从源数据库复制到目标数据库。Copy All Full Text Catalogs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server全文目录从源数据库复制到目标数据库。Copy All Full Text Stop Lists
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server全文停止列表从源数据库复制到目标数据库。Copy All Logins
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server登录名从源数据库复制到目标数据库。Copy All Objects
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server对象从源数据库复制到目标数据库。Copy Data
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有数据从源数据库复制到目标数据库。Copy All Partition Functions
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server分区函数从源数据库复制到目标数据库。Copy All Partition Schemes
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server分区方案从源数据库复制到目标数据库。Copy All Plan Guides
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server计划指南从源数据库复制到目标数据库。Copy All Roles
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server角色从源数据库复制到目标数据库。Copy All Rules
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server规则从源数据库复制到目标数据库。Copy All Schemas
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server架构从源数据库复制到目标数据库。Copy All Sql Assemblies
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server程序集从源数据库复制到目标数据库。Copy All SPs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server存储过程从源数据库复制到目标数据库。Copy All Synonyms
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server同义词从源数据库复制到目标数据库。Copy All Tables
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server表从源数据库复制到目标数据库。Copy All Aggregates
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server用户定义聚合从源数据库复制到目标数据库。Copy All UDDTs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server用户定义数据类型从源数据库复制到目标数据库。Create Target Database
,获取或设置一个布尔属性值,该值指定在传输操作中是否创建目标数据库。Copy All UDFs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server用户定义函数从源数据库复制到目标数据库。Copy All UDTTs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server用户定义表类型从源数据库复制到目标数据库。Copy All UDTs
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server用户定义类型从源数据库复制到目标数据库。Copy All Users
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server数据库用户从源数据库复制到目标数据库。Copy All Views
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server视图从源数据库复制到目标数据库。Copy All Xml Schema Colls
,获取或设置一个布尔属性值,该值指定在传输操作中是否将所有SQL Server XML架构集合从源数据库复制到目标数据库。
在最后一个部分,您可以看到传输脚本。
传输数据
SQL Server跟踪机制用于监视SQL Server内部的活动。每次发生活动时,SQL Server都会生成一个事件,并将该事件发送到监视工具(SQL Profiler),该工具会显示有关该事件的所有信息。SQL Trace和SQL Profiler使您能够分析性能,然后调优您的数据库。
当您想使用SQL Server的跟踪功能时,需要使用SMO Trace和replay类,它们提供了一个接口,您可以利用它来跟踪和记录事件、处理和分析数据以及重放跟踪事件。所有跟踪和重放类都位于Microsoft.SqlServer.Management.Trace
命名空间中。
以下基本示例记录前10个事件的名称。
static void Main(string[] args)
{
TraceServer ts = new TraceServer();
ConnectionInfoBase ci = new SqlConnectionInfo(@"ANANAS\ANANAS2009");
((SqlConnectionInfo)ci).UseIntegratedSecurity = true;
ts.InitializeAsReader(ci,
@"C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Profiler\Templates\Microsoft SQL Server\100\Standard.tdf");
for (int i = 0; i < ts.FieldCount; i++)
{
Console.WriteLine(ts.GetName(i));
}
int eventNumber = 0;
while (ts.Read())
{
Console.Write(ts.GetValue(0) + Environment.NewLine);
eventNumber++;
if (eventNumber == 10)
break;
}
ts.Close();
Console.WriteLine(Environment.NewLine + "Press any key to continue.");
Console.ReadKey();
}

第一步是创建一个TraceServer
对象,该对象代表SQL Server实例上的新跟踪。下一步是建立与SQL Server的连接。此连接由ConnectionInfoBase
对象表示。创建这两个对象后,您必须通过InitializeAsReader
方法初始化读取器。此方法接受2个参数。第一个是ConnectionInfoBase
对象,第二个是跟踪定义文件。跟踪定义文件决定了跟踪中包含的信息,即捕获每个事件的哪些事件和哪些跟踪数据列。
下一个更高级的示例在网格中显示了有关事件的所有信息。您可以随时启动和停止跟踪。此示例包含两个屏幕:主屏幕和登录屏幕。在登录屏幕上,您可以设置SQL Server实例和凭据。

主屏幕在网格视图中显示所有信息。顶部面板中有三个按钮:登录、选择模板和启动。

历史
- 2012年1月22日 - 发布文章