视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
将SqlServer对象的当前拥有者更改成目标拥有者
2020-11-09 07:17:01 责编:小采
文档


数据库操作当中,当数据库对象列表不只有一个普通的元素——objectname时,你将要使用objectowner.objectname来引用对象,但如果需要更改当前数据库中对象的所有者可以使用系统存储过程 sp_changeobjectowner (点击这里更详细)

sp_changeobjectowner
更改当前数据库中对象的所有者。
语法: sp_changeobjectowner  [ @objname = ] 'object' , [, @newowner = ] 'owner'. 参数. [@objname =] 'object'.  

    但往往由于数据库对象过多,希望批处理更改当前数据库中对象的所有者,那么你可以尝试使用Net Fetch的 nf_ChangeObjectOwner 存储过程来完成批处理。具体用法如下:

首先使用以下代码创建存储过程—— 

nf_ChangeObjectOwner 
将Sql Server对象的当前拥有者更改成目标拥有者
语法:nf_ChangeObjectOwner [, @current_Owner = ] 'owner',[,@target_Owner =] 'owner',[ ,@modify_Type=] type
代码如下:
if exists (select * from sysobjects where id = object_id(N'[nf_ChangeObjectOwner]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure nf_ChangeObjectOwner
GO

Create PROCEDURE nf_ChangeObjectOwner 
    @current_Owner nvarchar(255),    
    @target_Owner nvarchar(255),
    @modify_Type int
/***********************************************************************************************

nf_ChangeObjectOwner

实现功能:    将Sql Server对象的当前拥有者更改成目标拥有者
**** 使用本代码前请备份数据库!
**** 所带来的安全问题,与俺家的驴子无关!
**** 欢迎斧头劈我,劈死偶有奖!
调用方法:    Exec nf_ChangeObjectOwner @current_Owner,@target_Owner,@modify_Type

输入参数:    @current_Owner nvarchar(255)    --对象的当前拥有者
        @target_Owner nvarchar(255)    --对象的目标拥有者
        @modify_Type int        --0为默认,更改表的拥有者;1为视图和存储过程
输出参数:    RETURN值        = -1        --操作对象为0,操作对象不存在
                = -2        --操作失败,可能对象被锁定
                = 0(默认值)    --操作成功,打印更改对象数目@object_Num
        @object_Num            --SQL 打印值,返回更改成功的对象数目

                            @Write by Net Fetch.    @At 2005/09/12
                            @Email: cnNetFetch*Gmail.Com    blog.ad0.cn

************************************************************************************************/
AS
    DECLARE @str_Tbl_Name nvarchar(255),@object_Num int,@current_Owner_uid smallint
    Set @object_Num = 0
    DECLARE @return_status int
    Set @return_status = -1
    Set @current_Owner_uid = (Select uid From sysusers Where [Name] = @current_Owner)
    If Not (Len(@current_Owner_uid)>0)  
        RETURN -1
        If (@modify_Type = 1)
            DECLARE ChangeObjectOwner_Cursor CURSOR FOR Select [Name] From sysobjects Where (type='U' or type='V' or type='P') and userstat=0 and [Name]<>'nf_ChangeObjectOwner' and status>-1 and uid = @current_Owner_uid
        Else
            DECLARE ChangeObjectOwner_Cursor CURSOR FOR Select [Name] From sysobjects Where (type='U' or type='V' or type='P') and userstat<>0 and [Name]<>'dtproperties' and uid = @current_Owner_uid
        OPEN ChangeObjectOwner_Cursor
    BEGIN TRANSACTION Change_ObjectOwner        
        FETCH NEXT FROM ChangeObjectOwner_Cursor INTO @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 
                        ROLLBACK TRANSACTION Change_ObjectOwner
                        RETURN -2
                    END
                Set @object_Num = @object_Num + 1
                FETCH NEXT FROM ChangeObjectOwner_Cursor INTO @str_Tbl_Name
            END
        Print @object_Num
    COMMIT TRANSACTION Change_ObjectOwner
    CLOSE ChangeObjectOwner_Cursor
    DEALLOCATE ChangeObjectOwner_Cursor

Go

Usage(使用方法): Exec nf_ChangeObjectOwner 'dbo','你的用户名',0
   ——将所有用户表的拥有者更改成'你的用户名'
Usage(使用方法): Exec nf_ChangeObjectOwner 'dbo','你的用户名',1
   ——将除了用户表之外数据库对象(视图、存储过程)的拥有者更改成'你的用户名'

下载本文
显示全文
专题