专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » sqldmo:在SQL Server 中使用SQLDMO »正文

sqldmo:在SQL Server 中使用SQLDMO

来源: 发布时间:星期四, 2009年2月12日 浏览:85次 评论:0


prefix = o ns = \"urn:schemas-microsoft-com:office:office\" />

曾几何时,伙伴们为数据库升级伤透了脑筋.往往升级赶不上数据库升级(版本控制,这也许不是什么问题,但对于很大部分中国公司来说这是无法避免).而有些n久以前数据库要使用新时候,数据库升级简直就是无从下手.所以对比数据库升级紧要性就逐渐凸现出来.对于表和字段升级按道理来说是不难,通过sysobjectssyscolumns比较很容易可以找到区别的处,然后增加没有对象即可.而对于视图和存储过程等非表对象更新就有些为难了(当然视图和存储过程如果用手工办法是很简单).个在于如何生成对象脚本,个在于如何执行.大家都知道syscomments表中藏有此类对象脚本,人们肯定会优先考虑开采这个宝库.当站在型变量最大只能存储8000,这简直就是个不可逾越障碍.人们又想从导出文本脚本然后执行这个思路着手时,又发现从字段中取出脚本有个天然缺陷

:换行问题.(最后发

,这个问题也是可以解决).万般无奈下人们把渴望目光集中到了SQLDMO,身上总散发着无所不能光芒.

Transfer对象美妙身材展现在人们眼前时候,大家都对她美丽所折服——这不正是我们所寻找?动人的处就在于可以把个数据库对象脚本保存在内存中,然后连接到另个数据库上执行.太棒了!现在我们来看看她轮廓吧:

重要属性:

CopyAllDefaults Boolean 所有默认值

CopyAllObjects Boolean 所有对象

CopyAllRules Boolean 所有规则

CopyAllStoredProcedures

Boolean
所有存储过程

CopyAllTables Boolean 所有表

CopyAllTriggers Boolean 所有触发器

CopyAllUserDefinedDatatypes Boolean 所有用户自定义类型

CopyAllViews Boolean 所有视图

CopyData Boolean 所有数据

DestDatabase String 目标对象数据库

DestLogin String 目标数据库登陆用户名

DestPassword

String
目标数据库登陆密码

DestServer String 目标服务器

DestUseTrustedConnection Boolean 用户信任连接

DropDestObjectsFirst Boolean 是否先删除目标对象

IncludeDependencies Boolean 是否包含依靠对象

ScriptType Boolean 脚本类型

重要思路方法:

AddObject 增加对象

AddObjectByName 通过对象名称增加对象

好了,大家应该对这个对象略有些了解了.

SQLDMO熟悉人也许下子就可以从中得到灵感,而初学者在这里恐怕还是头雾水.不过不用着急,具体使用方法我们会慢慢道来:

CREATE PROCEDURE P_UDB --以源数据库为模板升级目标数据库

( @Source_DB sysname --原数据库

,@Des_DB sysname --目标数据库

,@UserName sysname --用户名

,@psw sysname --密码

)



AS

nocount _disibledevent=>--/* 局部变量声明

declare @ObjName sysname

,@SrvID --服务器ID

,@DBsId --数据库集ID

,@transferID --传输ID

,@SDBId --源数据库ID

,@DDBID

--目标数据库ID

,@SViewListID --源数据库视图列表

,@DViewListID --目标数据库视图列表

,@str Nvarhar(4000)

,@name sysname

,@hr --执行语句返回值

,@Error

--返回值(999:存储过程或触发器;9999:视图)

--*/

--/*创建sqldmo对象 前面我们已经说过SQLDMO是个com,在SQL Server中使用OLE --自动化对象需要用到sp_OACreate等系列存储过程,读者如果有不明白可以自--己查阅相关资料

exec @hr=sp_oacreate \'SQLDMO.sqlserver\',@SrvID output

@hr<>0

begin

@Error=1

goto PEnd

end

--*/

--/*连接服务器

exec @hr=sp_oamethod @SrvID,\'connect\',null,@@ServerName,@UserName,@psw

@hr<>0

begin

@Error=2

goto PEnd

end

--*/

--/*取数据库集

exec @hr=sp_oagetproperty @SrvID,\'databases\',@DBsId output

--*/

--/*选择源数据库

exec @hr=sp_oamethod @DBsId,\'item\',@SDBId output,@Source_DB



@hr<>0

begin

@Error=3

goto PEnd

end

--*/

--/*选择目标数据库

exec @hr=sp_oamethod @DBsId,\'item\',@DDBId output,@Des_DB

@hr<>0

begin

@Error=4

goto PEnd

end

--*/

/*Tansfer属性设置(生成 3大对象)

exec @hr=sp_oacreate \'SQLDMO.Transfer\',@transferID output

exec @hr=sp_oaproperty @transferID,\'DestServer\',@@ServerName

exec @hr=sp_oaproperty @transferID,\'DestLogin\',@UserName

exec @hr=sp_oaproperty @transferID,\'DestPassword \',@psw

exec @hr=sp_oaproperty @transferID,\'DestDatabase\',@des_DB

exec @hr=sp_oaproperty @transferID,\'DropDestObjectsFirst \',1

exec @hr=sp_oaproperty

@transferID,\'CopyAllStoredProcedures \',1


exec @hr=sp_oaproperty @transferID,\'CopyAllTriggers\',1

exec @hr=sp_oaproperty @transferID,\'CopyAllViews\',1

--exec @hr=sp_oaproperty @transferID,\'ScriptType \',1 这里大家可以试试这个属性

exec @hr=sp_oamethod @DDBId,\'Transfer \',null,@transferID

exec sp_OADestroy @TransferID

@hr<>0

begin

@Error=10

goto PEnd

end

*/

PEnd:

exec @hr = sp_OAMethod @SrvID, \'DisConnect\'

exec sp_OADestroy @SrvID

pr (@Error)

Return (@Error)

GO

上边存储过程只要是介绍思路方法实现,而具体功能比如表及字段比较生成这里就省略了.

其实有个大家最后也没能解决好问题就是对象依赖问题

.许多对象比如视图里嵌视图,这时生成和执行需要有顺序.虽然有算法但有缺陷.希望读者能可以提供好算法.



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: