数据库操作当中,当数据库对象列表不只有一个普通的元素——objectname时,你将要使用objectowner.objectname来引用对象,但如果需要更改当前数据库中对象的所有者可以使用系统存储过程sp_changeobjectowner(点击这里更详细) sp_changeobjectowner 更改当前数据库中对象的所有者。 语法:sp_changeobjectowner[@objname=]'object',[,@newowner=]'owner'.参数.[@objname=]'object'. 但往往由于数据库对象过多,希望批处理更改当前数据库中对象的所有者,那么你可以尝试使用NetFetch的nf_ChangeObjectOwner存储过程来完成批处理。具体用法如下: 首先使用以下代码创建存储过程—— nf_ChangeObjectOwner 将SqlServer对象的当前拥有者更改成目标拥有者 语法:nf_ChangeObjectOwner[,@current_Owner=]'owner',@target_Owner=]'owner',@modify_Type=]type <div class="codetitle"><a style="CURSOR: pointer" data="48374" class="copybut" id="copybut48374" onclick="doCopy('code48374')"> 代码如下:<div class="codebody" id="code48374"> ifexists(select*fromsysobjectswhereid=object_id(N'[nf_ChangeObjectOwner]')andOBJECTPROPERTY(id,N'IsProcedure')=1) dropprocedurenf_ChangeObjectOwner GO CreatePROCEDUREnf_ChangeObjectOwner @current_Ownernvarchar(255), @target_Ownernvarchar(255), @modify_Typeint /* nf_ChangeObjectOwner 实现功能:将SqlServer对象的当前拥有者更改成目标拥有者 使用本代码前请备份数据库! 所带来的安全问题,与俺家的驴子无关! *欢迎斧头劈我,劈死偶有奖! 调用方法:Execnf_ChangeObjectOwner@current_Owner,@target_Owner,@modify_Type 输入参数:@current_Ownernvarchar(255)--对象的当前拥有者 @target_Ownernvarchar(255)--对象的目标拥有者 @modify_Typeint--0为默认,更改表的拥有者;1为视图和存储过程 输出参数:RETURN值=-1--操作对象为0,操作对象不存在 =-2--操作失败,可能对象被锁定 =0(默认值)--操作成功,打印更改对象数目@object_Num @object_Num--SQL打印值,返回更改成功的对象数目 @WritebyNetFetch.@At2005/09/12 @Email:cnNetFetchGmail.Comblog.ad0.cn / AS DECLARE@str_Tbl_Namenvarchar(255),@object_Numint,@current_Owner_uidsmallint Set@object_Num=0 DECLARE@return_statusint Set@return_status=-1 Set@current_Owner_uid=(SelectuidFromsysusersWhere[Name]=@current_Owner) IfNot(Len(@current_Owner_uid)>0) RETURN-1 If(@modify_Type=1) DECLAREChangeObjectOwner_CursorCURSORFORSelect[Name]FromsysobjectsWhere(type='U'ortype='V'ortype='P')anduserstat=0and[Name]<>'nf_ChangeObjectOwner'andstatus>-1anduid=@current_Owner_uid Else DECLAREChangeObjectOwner_CursorCURSORFORSelect[Name]FromsysobjectsWhere(type='U'ortype='V'ortype='P')anduserstat<>0and[Name]<>'dtproperties'anduid=@current_Owner_uid OPENChangeObjectOwner_Cursor BEGINTRANSACTIONChange_ObjectOwner FETCHNEXTFROMChangeObjectOwner_CursorINTO@str_Tbl_Name WHILE(@@FETCH_STATUS=0) BEGIN Set@str_Tbl_Name=@current_Owner+'.'+@str_Tbl_Name Print@str_Tbl_Name EXEC@return_status=sp_changeobjectowner@str_Tbl_Name,@target_Owner IF(@return_status<>0) BEGIN ROLLBACKTRANSACTIONChange_ObjectOwner RETURN-2 END Set@object_Num=@object_Num+1 FETCHNEXTFROMChangeObjectOwner_CursorINTO@str_Tbl_Name END Print@object_Num COMMITTRANSACTIONChange_ObjectOwner CLOSEChangeObjectOwner_Cursor DEALLOCATEChangeObjectOwner_Cursor Go
Usage(使用方法):Execnf_ChangeObjectOwner'dbo','你的用户名',0 ——将所有用户表的拥有者更改成'你的用户名' Usage(使用方法):Execnf_ChangeObjectOwner'dbo',1 ——将除了用户表之外数据库对象(视图、存储过程)的拥有者更改成'你的用户名'
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|