技术开发 频道

SQL Server2005之SMO实战

 

八、使用SMO对象产生脚本
现在现在,本文一直关注如何使用SMO来发现并使用SQL对象,而SMO的功能还不仅仅如些,它还可以根据我们定义的很多SQL Server对象来产生相应的T-SQL脚本。在大多数企业,数据库管理员使用SQL Server Management Studio来产生脚本,以便他们可以将一个数据库的结构复制到另一个数据库上。为了演示SMO的脚本产生能力,本例程序的表、视图、存储过程的树结点都可以通过上下文菜单来产生相应的脚本。在产生完脚本后,程序将这些脚本复制到剪切版上。

    使用SMO的默认方法,我们可以通过简单地调用对象的Script方法来为一个对象产生脚本。默认的脚本非常简单,只包括了产生对象的代码,如下面是一个使用默认方法产生的表对象的脚本,脚本代码如下:

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[PeopleIKnow]( [FriendID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [LastName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [Nickname] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [Friend] [int] NULL, [College] [int] NULL ) ON [PRIMARY] GO
读者应注意一点:从Script方法输出的 脚本不包含上面显示的GO表达式。而取而代之的是Script方法返回了一个StringCollection,在这个集合中每个字符串包含了上面的一个表达式。而本程序为了使脚本更可用,在每个表达式之间加了GO语句。这类似于SQL Server Management Studio。

    Script方法产生脚本虽然方便,但它往往不能满足我们的要求。如果要产生更多、更丰富的脚本,还需要我们建立其他相关的对象。如建立表的脚本还需要包括索引、许可、约束等。为了改变SMO默认产生脚本的行为,我们可以使用一个ScriptingOptions对象,并传递相关的用于产生脚本的参数,如下面的代码所示:

Dim strc As StringCollection Dim objScriptingOptions As ScriptingOptions . . . objScriptingOptions = New ScriptingOptions objScriptingOptions.ClusteredIndexes = True objScriptingOptions.NonClusteredIndexes = True objScriptingOptions.DriAll = True objScriptingOptions.Indexes = True objScriptingOptions.IncludeDatabaseContext = True objScriptingOptions.Permissions = True . . . strc = objTable.Script(objScriptingOptions)
 我们可以在MSDN中找到完整的关于ScriptingOptions类文档。下面的代码显示了使用ScriptingOptions进行设置后产生的脚本。

USE [SMOSample] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[PeopleIKnow]( [FriendID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [LastName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [Nickname] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [Friend] [int] NULL CONSTRAINT [DF_PeopleIKnow_StillMyFriend] DEFAULT ((1)), [College] [int] NULL, CONSTRAINT [PK_PeopleIKnow] PRIMARY KEY CLUSTERED ( [FriendID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO CREATE UNIQUE NONCLUSTERED INDEX [IX_PeopleIKnow] ON [dbo].[PeopleIKnow] ( [FirstName] ASC, [LastName] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO GRANT DELETE ON [dbo].[PeopleIKnow] TO [SMOSampleUser] GO GRANT INSERT ON [dbo].[PeopleIKnow] TO [SMOSampleUser] GO GRANT SELECT ON [dbo].[PeopleIKnow] TO [SMOSampleUser] GO GRANT UPDATE ON [dbo].[PeopleIKnow] TO [SMOSampleUser] GO ALTER TABLE [dbo].[PeopleIKnow] WITH CHECK ADD CONSTRAINT [FK_PeopleIKnow_Colleges] FOREIGN KEY([College]) REFERENCES [Colleges] ([CollegeID]) GO ALTER TABLE [dbo].[PeopleIKnow] CHECK CONSTRAINT [FK_PeopleIKnow_Colleges] GO
也许我们会发现SQL Server Management Studio是非常有用的,但它却缺少一些对我们在企业中管理SQL Server更实用的工具。如有很多人抱怨SQL Server Management Studio在产生建立对象脚本时并不能同时产生DROP和CREATE表达式。而大多数开发人员需要将数据库的结构迁移到其他的数据库中,但在这些数据库的某些对象可能存在,因此,如果不同时使用DROP和CREATE,就可能会造成不小麻烦。但当我们从本文中学习了SMO后,就可以在自己的应用程序中定制这些功能了。
0
相关文章