SQL Server"选定的用户拥有对象,所以无法除去该用户"

方法一:
由于MSSQL200数据库的错误,把一个原来的数据库还原到现在的SQL上,此时来到用户里面,想把还原过来的用户删除掉,结果却提示“因为选定的用户拥有对象,所以无法除去该用户”:

删除不了,我就准备把系统里的该用户添加到这个数据库上来看看可以不,却又提示这么一个错误(microsoft sql-dmo窗口):

错误21002:[SQL-DMO]用户"liuhui"已经存在。


因为业务要求,又不能重新建立一个用户给它或换一个用户,该数据库只能被该用户使用,标准的规范的服务器格式不能打破,要不会带来以后维护的超级麻烦,后求救google和baidu,结果无所不知的他们让我失望了,没办法,只好请求一个经验丰富的朋友帮忙,问题解决了,该技术为不传之密,一般人我不告诉他:

1.打开企业管理器,展开服务器,右键点击本地服器选属性,打开SQL Server 属性(配置)窗口:

2.选择常规窗口,将自动启动 SQL Server 代理选上:

点确定。

3.重复动作1打开SQL Server 属性(配置)窗口,选择服务器设置窗口:

将允许对系统目录直接进行修改选上,点确定。

4.展开数据库,看到数据库系统表 sysusers ,右键 -> 打开表 -> 返回所有行:

5.选择应为还原而添加进来的用户,找到相关行,点右键 删除:

选择是。

在返回到用户列表,看看还有该用户没有,如果没有用户,我们在去SQL的安全里面把该数据库对应的用户添加上去,我把liuhui添加上去了,测试网站没有问题了。

再返回动作3把选择上的允许对系统目录直接进行修改去掉。

==================================================

方法二:
对MSSQL出现选定的用户拥有对象而无法删除的处理:

Create PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)

DECLARE curObject CURSOR FOR
select 'Name' = name,'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject

GO

==================================================

方法三(存储过程):

IF OBJECT_ID('ChangeAllObjOwner') IS NOT NULL DROP PROC ChangeAllObjOwner
GO

CREATE PROCEDURE ChangeAllObjOwner (
@oldowner sysname,
@newowner sysname
)
AS
DECLARE @objname sysname
SET NOCOUNT ON

--check that the @oldowner exists in the database
IF USER_ID(@oldowner) IS NULL
BEGIN
RAISERROR ('The @oldowner passed does not exist in the database', 16, 1)
RETURN
END
--check that the @newowner exists in the database
IF USER_ID(@newowner) IS NULL
BEGIN
RAISERROR ('The @newowner passed does not exist in the database', 16, 1)
RETURN
END

DECLARE owner_cursor CURSOR FOR
SELECT name FROM sysobjects WHERE uid = USER_ID(@oldowner)

OPEN owner_cursor
FETCH NEXT FROM owner_cursor INTO @objname
WHILE (@@fetch_status <> -1)
BEGIN
SET @objname = @oldowner + '.' + @objname
EXEC sp_changeobjectowner @objname, @newowner
FETCH NEXT FROM owner_cursor INTO @objname
END

CLOSE owner_cursor
DEALLOCATE owner_cursor
GO

在查询分析器里执行下列语句:
EXEC ChangeAllObjOwner @oldowner = '原先的用户名', @newowner = '新的用户名'

==================================================

MSSQL备份移植到另一服务器还原时容易遇到的问题……
MSSQL备份移植到另一服务器还原时容易遇到的问题,尤其是从虚拟主机备份回来的数据库在本机还原的问题…

会出现用SQL原来的用户名和密码无效的情况
无法删除某一个系统表
用sa连接做Select时提示表名无效
无法删除原备份数据库中的用户名,提示“因为选定的用户拥有对象,所以无法除去该用户。”
主要原因是原来的备份还原时保留了原用户的信息,导致产生孤立用户……

这时候需要用sp_changeobjectowner将对象的所有关系更改到另一个用户上,既更改数据库对象的所有者。

格式:
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
例子 在查询分析器中录入:

sp_changeobjectowner 'web102101.tablename', 'dbo'
依次将所有的所属用户都改为dbo,然后现在数据库的用户中把孤立用户删除,再到安全中删除登陆信息。

并可以再依次创建新用户了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值