MSSQL在另一台机子上恢复别人备份引起的问题及解决方式!

本文介绍了解决SQL Server中因用户拥有对象而无法删除的问题。提供了两种方法:一是单独更改表的所有者为dbo;二是创建存储过程批量更改所有对象的所有者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: 
       今天朋友恢复一个在别人机器备份的数据库到SQL SERVER,恢复后该数据库中有一个mis用户,该用户是数据库所有者,很多表的所有者也是他,但安全性里的登录中没有该用户,删除不了该用户,提示“因为选定的用户拥有对象,所以无法除去该用户”!

在参考了帖子:http://www.itpub.net/429496.html之后才把问题解决,具体解决方式如下:
      1 如果是一张表有此问题,解决方式如下:
       
       exec sp_changeobjectowner mis.tablename', 'dbo'
     
       这样就把tablename指定的表的所有者赋值给了dbo用户

  
   2 如果所有表都存在此问题,这是就要编写存储过程实现批量修改了
       
         IF OBJECT_ID('ChangeAll') IS NOT NULL DROP PROC ChangeAll
         GO

         CREATE PROCEDURE ChangeAll (
             @old sysname,
             @new sysname
         )
        AS
             DECLARE @objname sysname

             SET NOCOUNT ON

             IF USER_ID(@old) IS NULL
                BEGIN
                    RAISERROR ('The @old passed does not exist in the database', 16, 1)
                    RETURN
                END
             IF USER_ID(@new) IS NULL
                BEGIN
                    RAISERROR ('The @new passed does not exist in the database', 16, 1)
                    RETURN
                END

             DECLARE owner_cursor CURSOR FOR

             SELECT name FROM sysobjects WHERE uid = USER_ID(@old)
             OPEN owner_cursor
             FETCH NEXT FROM owner_cursor INTO @objname
             WHILE (@@fetch_status <> -1)
                 BEGIN
                     SET @objname = @old + '.' + @objname
                     EXEC sp_changeobjectowner @objname, @new
                     FETCH NEXT FROM owner_cursor INTO @objname
                 END

            CLOSE owner_cursor
            DEALLOCATE owner_cursor
            GO

EXEC ChangeAll @old = 'mis', @new = 'dbo'

这样就完成了批量修改权限的工作


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值