大家好,请教大家一个问题,最近,我将我的SQL Server 205数据库从一台数据库服务器上转移到了另一台数据库服务器,转移的方式是通过将原数据库服务器上的数据库备份成为 .bak 文件,然后再还原到新的数据库服务器上去。整个备份还原的过程都是非常顺利的。但是当我开始使用新的数据库服务器工作时,所有需要调用数据库的页面均显示如下的错误信息:
Microsoft OLE DB Provider for SQL Server 错误 '80040e37' 对象名 'table1' 无效。 /aaa/bbb.asp,行 17
我 Google 上搜索了下该错误,发现原是孤立用户错误,网上的解释如下:当数据库从一个地方还原到另一个地方时会出现孤立用户问题。孤立用户简单来说就是在原来数据库上的用户到了新的数据库中就找不到登录用户了。即使你建一个一模一样的登录用户,也没法与旧的用户对应上,因为sqlserver中用户是通过SID去标识一个用户的,而不是用户名。这时如果你想删掉旧用户也是办不到的,因为旧用户会占有一些对象,例如表,存储过程等,这些东西令你无法删掉它。
我找到了有2种解决方案,但是我不知道这2种方案有什么差别,使用哪种方案来你解决这个问题更加好,请大家帮忙分析下:方案1:(http://nt.discuz.net/showtopic-23280.html)先在要操作的数据库中建立如下存储过程,代码如下:Create PROCEDURE ChangeAllObjOwner (
@oldowner sysname,
@newowner sysname
)
AS
DECLARE @objname sysname
SET NOCOUNT ON
--检查旧用户是否存在
IF USER_ID(@oldowner) IS NULL
BEGIN
RAISERROR ('The @oldowner passed does not exist in the database', 16, 1)
RETURN
END
--检查新用户是否存在
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存储过程建立后
我用下面的方法完成了最后的步骤
在企业管理器里新建查询对所在数据库执行下面的语句(假设旧数据库用户是user1 新数据库是user2)exec ChangeAllObjOwner 'user1','dbo'把对象都转成是dbo的,也就是sa帐号下的,这时候就可以删除旧用户user1了
然后执行exec ChangeAllObjOwner 'dbo','user2'
这样就把对象都转成新用户user2了,至此,孤立用户把问题解决。方案2:(http://blog.sina.com.cn/s/blog_49dd67ad01008d58.html)步骤:1.把备份的数据库还原到新的数据库服务器中
       1.1企业管理器-->1.2数据库(右键)-->1.3所有任务-->1.4还原数据库-->1.5常规/还原为数据库/写上你要的数据库名字xxxx/选中从设备/选择设备/添加(浏览找到你的数据库备份文件)/确定/确定/确定-->1.6选项-->1.7将数据库还原为f:\usr\xxxx.mdf一般存放在你sql安装的目录下如:d:\Program Files\Microsoft SQL Server\MSSQL\Data\xxxx.mdf-->1.8确定就ok了!!      2. 查看你刚刚还原的数据库中的用户如:abc;
      3. 查看安全性下面的登陆用户中是否有:abc如果没有此时的abc就是一个孤立用户;
      4.打开查询分析器运行脚本
        use   数据库名
        go  
        DECLARE    @sid    BINARY(16)   
        SELECT     @sid=sid FROM sysusers WHERE name='abc' and    islogin=1
        exec       sp_addlogin   @loginame = 'abc',@sid = @sid
      5.注意,应该是先还原,如果事先在sql的安全性--登录中已经
       创建abc这个登录,则先删除它,再执行上面的语句.同过上面的就能解决问题了!上面2种哪种来解决这个问题更好,请大家帮忙分析下,谢谢了!

解决方案 »

  1.   

    我看直接弄个MDF文件过去,附加一次就好了
      

  2.   

    以下是sql server 2005 bol的内容若要解决孤立用户问题,请执行以下过程:以下命令将重新链接 <login_name> 指定的服务器登录帐户与 <database_user> 指定的 AdventureWorks 数据库用户。  USE <database_name>;
    GO
    sp_change_users_login @Action='update_one', @UserNamePattern='<database_user>', @LoginName='<login_name>'; 
      

  3.   

    4楼的方法可以一试。
    还有一个更简单的可以试试,在用bak文件恢复时请注意选择用户(或者架构所有者),有个选项,仔细找一下,这样就可以直接恢复为原来的用户了,当然,也可以事先建立一个用户,恢复后再分配其相应的权限。