当前位置:数据库 > SQLServer >>

sql7.0数据库备份还原时遇到的问题

答案:

删除时他提示错误:因为选定的用户拥有对象,所以无法除去该用户

匆匆感觉最简单的方法:
打开查询分析器,选中需要的数据库,执行
sp_changeobjectowner 'test_user.test_table', 'dbo'
go

多个表,请复制以上语句

      test_user.test_table'
需要删除的用户.指定表

强行将对象拥有者修改成“dbo”,需要一个一个表清理,下边为全部文章!

--------------------------------------------

我租用的万网的服务器,通过万网提供的域名:881的页面进去有数据库管理备份项,我将备份后的文件下载下来,恢复后出现怪问题。这个还原出来的数据库的用户里用户名称是是万网给我分配的用户名还有一个是dbo的用户,但这两个都没登录名。数据库访问是许可,我在数据库里安全里建立这样的用户或是别的用户他的登录名都没有的。那个数据库的用户我也删除不了。删除时他提示错误:因为选定的用户拥有对象,所以无法除去该用户。我真不知道怎么办了。我运行我的conn.asp文件没错但检索数据表时就出错。这到底是怎么回事呀。

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

通过执行 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'

我照着这个做,怎么还是不行。sp_addlogin @loginame = 'nancyd',
@sid = 0x32C864A70427D211B4DD00104B9E8A00它意说我@sid正被使用。而且USE Northwind
SELECT *
FROM sysusers
WHERE name = 'janetl'这步时没有记录。
我在查询分析器里查看表时比如select * from admin它就说admin对像不存在。这个写:select * from cww.admin在admin加个用户名就可以的。这怎么办呢?

--孤立用户的产生演示

--创建一个测试的数据库
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

[page_break]

--查看用户信息
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

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
这样建立的登录用户aa 没有访问DB_test权限。只有master northwind那几个库,没有db_test库该怎么办?我这建出来的db_test确实像我还原出来的数据库一样。但是我还是访问不成那个库呀。

照我写一步骤一步一步来.

我只是告诉你孤立用户如何产生,以及如何解决

没有db_test这个用户,说明你根本没有按照我写的步骤去做.

因为我并没有你的环境,根本不知道你的库名是什么,孤立用户名是什么,SQL实例中是否有登录,这些一无所知,所以只能告诉你方法,你自己理解后去解决你自己的问题.

好吧,我在试一遍,但能说说什么原理吗?你的意思是不是先建登录用户,后还原数据库,然后在让他们登录用户默认成当前还原的这个数据库?是不是这样一个道理。

原理,先还原数据库.

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

上一个:无法在Web服务器上启动调试,未将项目配置为进行调试.
下一个:SQL数据库备份、还原、转移详解

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,