刚好遇到一个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取消勾选“允许对系统目录直接进行修改”