导航

yaosansi's Blog

当你背向太阳的时候,你只会看到自己的阴影!能力是有限的,努力无限的!

« 常用正则表达式Visual Studio 2005 新功能、新特性 »

对mssql出现选定的用户拥有对象而无法删除的处理

  • 本站大部分内容从网上收集,收集目的仅供研究、学习。涉及版权或不希望收录您的文章请您及时与我联系。
  • 本站IM群,请自行选择。请各位朋友按照自己喜好加入。加入群后请及时发言,防止被清理。谢谢您的合作!!!
  • QQ群:Y①WEB开发(ASP.NET)号码:7351660 QQ群:Y②WEB开发(ASP+.NET)号码:11864905
  • QQ群:Y③WEB开发(DIV+CSS)号码:16610506 QQ群:Y④WEB开发(JS+AJAX)号码:16143998
  • QQ群:Y⑤WEB开发(新手)号码:12777715 MSN群:yaosansi[at]126.com
方法一
首先你需要做的第一件事
企业管理器-〉选择服务器-〉属性-〉服务器设置-〉挑上允许对系统目录。。。-〉确定
第二步
找到你的数据库找到sysusers表那你以前的用户删除
第三步回去吧属性值改回来
第四部重建用户即可

方法二

对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



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

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

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

格式:

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

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

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












PS:为验证所述查到“猴哥”zjcxc(邹建)大师兄的贵文:

孤立用户疑难解答
把数据库备份还原到另一个服务器时,可能会遇到孤立用户的问题。下面的方案显示并解决了这个问题:

通过执行 sp_addlogin,把登录 janetl 改名为 dbo。
sp_addlogin 'janetl', 'dbo'

备份数据库。在本例中,备份 Northwind。
BACKUP DATABASE Northwind
TO DISK = 'c:\mssql\backup\northwnd'

除去刚刚备份的数据库。
Drop DATABASE Northwind

除去登录。
sp_droplogin 'janetl'

还原备份的数据库。
RESTORE DATABASE Northwind
FROM DISK = 'c:\mssql\backup\northwnd'

janetl 登录不能访问 Northwind 数据库,除非允许 guest 登录。尽管 janetl 登录已经删除,它仍然(作为一个孤立行)显示在 sysusers 表中:

USE Northwind
Select *
FROM sysusers
Where name = 'janetl'

解决孤立用户问题

用 sp_addlogin 添加一个临时登录。为孤立用户指定安全标识符 (SID)(从 sysusers)。
sp_addlogin @loginame = 'nancyd',
@sid = 0x32C864A70427D211B4DD00104B9E8A00

用 sp_dropalias 除去属于别名 SID 的临时别名。
sp_dropalias 'nancyd'

用 sp_dropuser 除去原始用户(即现在的孤立用户)。
sp_dropuser 'janetl'

用 sp_dropuser 除去原始登录。
sp_droplogin 'nancyd'


--孤立用户的产生演示

--创建一个测试的数据库
Create DATABASE DB_test
go

--创建一个登录
EXEC sp_addlogin 'aa'

--设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'
go

--切换到测试数据库
USE DB_test
go

--为登录 aa 在当前测试数据库中添加用户
EXEC sp_grantdbaccess 'aa'
go

--至此,用户 aa 登录后,其默认的当前数据库就是 DB_test
--我们可以在查询分析器,使用用户 aa 登录一下,来验证我们的测试环境

--备份测试数据库,为下面的测试做准备
BACKUP DATABASE DB_test TO DISK='c:\DB_test.bak' WITH INIT
go

/*=================== 产生孤立用户 ======================*/

--切换到 master 数据库
USE master
go

--删除测试数据库
Drop DATABASE DB_test
go

--删除登录 aa
EXEC sp_droplogin 'aa'
go

/*=================== 孤立用户表现形式1 ======================*/

--还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go

--切换到测试数据库
USE DB_test
go

--查看用户信息
select name from sysusers where islogin=1

--我们会发现,虽然我们已经将登录 aa 删除了,但用户 aa 仍然存在于数据库中
--尝试一下,用 aa 登录,被告知登录失败
go

--再把删除的登录添加回去
EXEC sp_addlogin 'aa'

--设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'

--再次登录,被告知无法打开默认数据库,登录失败
go

--于是把默认数据库改为 master
EXEC sp_defaultdb 'aa','master'

--这次再登录,就可以登录了
go

--尝试切换到测试数据库 DB_test
USE DB_test

--得到错误信息: 服务器用户 'aa' 不是数据库 'DB_test' 中的有效用户。
--看来用户 aa 与登录 aa 失去了联系
go

--尝试重新为登录 aa 添加用户 aa
EXEC sp_grantdbaccess 'aa'

--得到错误信息:当前数据库中已存在用户或角色 'aa'。

--这次我们换个顺序,先建立登录,再恢复数据库,看能否使登录与用户自动建立回联系

--做这个测试之前,先清理测试环境,即做前面的<产生孤立用户>步骤,然后再开始测试

--先添加登录
EXEC sp_addlogin 'aa'
go

--还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go

--切换到测试数据库
USE DB_test
go

--查看用户信息
select name from sysusers where islogin=1

--我们会发现,用户 aa 存在于数据库中
--尝试一下,用 aa 登录,并切换到 DB_test
--结果是登录成功,访问 DB_test 出现和测试1一样的错误

/*==== 解决上面提到的孤立用户的问题 ====*/

--用sa 登录系统,查询孤立用户的sid

--如果你已经预先在sql中创建了aa这个登录,则先删除它
EXEC sp_droplogin 'aa'

DECLARE @sid BINARY(16)
Select @sid=sid FROM DB_test..sysusers Where name='aa' and islogin=1

exec sp_addlogin @loginame = 'aa',@sid = @sid



原理,先还原数据库.

再找出孤立用户的用户名及sid
然后在sql实例中创建该用户的登录,创建时强制指定sid






原创文章如转载,请注明:转载自http://www.yaosansi.com
订阅本站,阅读更多文章
  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog .Theme from Google黑板报 By Washun

Copyright 2005-2008 yaosansi'site All Rights Reserved.

感谢Denny·G 为本站提供FTP空间
辽ICP备05021434号

Search

  •  

赞助商广告

控制面板

最新评论及回复

最近发表