1/1页1 跳转到查看:75
发新话题 回复该主题

“因为选定的用户拥有对象,所以无法除去该用户”错误的解决办法

“因为选定的用户拥有对象,所以无法除去该用户”错误的解决办法

刚好遇到一个SQL Server 2000的一个错误,以前也没注意过,去Google了一下,居然没发现什么合适的东西,换报错信息搜索一下,发现内容超多,看起来还是要在搜索关键字上注意一下,我搜索的内容是“因为选定的用户拥有对象,所以无法除去该用户”,把网上看到的东西整理一下,以便其他朋友解决。
    一、错误信息
    先来看看错误,图片是转载的,懒得去服务器上抓了。
    1、删除用户报错:
   
 附件: 您所在的用户组无法下载或查看附件
    2、添加同名用户,添加权限报错:
   
 附件: 您所在的用户组无法下载或查看附件
    二、问题原因
    出现这类问题的主要原因是在数据库中有些表的权限指定给了这个“欲删除的用户”,而dbo用户对这些表没有权限,所以在删除的时候提示“因为选定的用户拥有对象,所以无法除去该用户”;而在添加同名数据库用户后,在指定权限时因为该用户已经有了一定权限,所以会提示该用户已经存在。
    三、解决办法
    大致看了下网上说的几种办法,整理一下吧:
    1、使用不同的数据库用户来管理,这样就可以避免了同名用户的问题;
    该办法绕开了我们讨论的问题,不说了。
    2、在查询分析器中执行脚本,赋予dbo表权限,删除“欲删除的用户”的权限,然后就可以删除该用户了,注意是在该数据库的用户位置删除;
use 你的库名称
go

declare tb cursor local
for
select 'sp_changeobjectowner '
+quotename(
+quotename(user_name(uid))
+'.'+quotename(name),'''')
+',''dbo'''
from sysobjects
where objectproperty(id,N'isusertable')=1
and uid<>user_id('dbo')
declare @s nvarchar(4000)
open tb
fetch tb into @s
while @@fetch_status=0
begin
exec(@s)
fetch tb into @s
end
close tb
deallocate tb

    拷贝以上代码,替换“你的库名称”为你的数据库对应的名称,在查询分析器里执行即可;
    该方法简单方便,可以快速解决问题,推荐使用。
    3、用sp_changeobjectowner将对象的所有关系更改到另一个用户上,然后逐个表去修改,实际是第二种方法的分步骤执行。
格式:
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'

在查询分析器中录入:
sp_changeobjectowner '你的库名称.需要修改的表名称', 'dbo'
    这种方法适合针对不同表需要设置不同用户权限的情况,但是明显操作需要一步一步来,如果是需要批量处理,还是建议采用第二种方法;
    4、直接在sysusers表中删除“欲删除的用户”的对应记录即可,但是这种方法是直接操作系统表,且执行完成后被删除用户以前用户权限的表的用户权限成为了空,dbo仍然没有权限,新添加用户并赋予权限后,对应表的权限就再次赋予新用户,其实数据库仍然是残损的,下一次备份恢复时还是会遇到类似的问题,所以不建议使用。如选择这种方法,操作步骤如下:
    4.1打开数据库属性
   
 附件: 您所在的用户组无法下载或查看附件
    4.2勾选“允许对系统目录直接进行修改”
   
 附件: 您所在的用户组无法下载或查看附件
    4.3打开sysusers
   
 附件: 您所在的用户组无法下载或查看附件
    4.4删除对应记录
   
   
    4.5取消勾选“允许对系统目录直接进行修改”
   
附件:您所在的用户组无法下载或查看附件
今天的媚力就在于只有一次,对此我们常常不已为然,就象我们见惯了晴空万里,阳光灿烂的日子。就以为明天永远属于我们。抓住今天,抓住现在拥有的。

TOP

 
1/1页1 跳转到
发表新主题 回复该主题