目的地指南:

Microsoft OLE DB Provider for SQL Server错误80040e.

日期:2009-7-29 16:10:50 作者: 出处:

网络中心报修系统今早一登录在首页便出现了“SQL Server 错误 '80040e37'”的错误提示。

问题原因:

把数据库备份还原到另一个服务器时,可能会产生孤立用户的问题;


解决办法:

步骤:

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这个登录,则先删除它,再执行上面的语句.同过上面的就能解决问题了!======================================================================
总结:孤立用户疑难解答   
     把数据库备份还原到另一个服务器时,可能会遇到孤立用户的问题。下面的方案显示解决了这个问题:    

通过执行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一样的错误
for SQL Server 错误 '80040e37'
对象名 'Dv_User' 无效。

/***,行 *

先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错.
重写了一下代码,结果还是一样.
怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误.判断是数据库出现了问题.数据库链接没错.导入也没错.
go了一把,就解决了.
  
把所有表的所有者改为DBO即可。
执行下面语句,更改所有表的所有者为DBO
exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"


*在如何修改数据库所有者的操作上出现了点曲折, 做总结如下:

1:只需 运行sp_changeobjectowner '表名','dbo'即可;
2.但要将所有的表的所有者都改为dbo,可以用循环处理,此处略;
3.其实用SQL的系统存储过程sp_MSForEachTable可以轻松搞定,只需运行
exec sp_MSForEachTable 'sp_changeobjectowner ''?'', ''dbo'''。
当然,可能运行时会有错误出现,(比如有些表的所有者原先就是dbo,会提示“因为新所有者 'dbo' 已有同名的对象。”),再次运行该语句一遍。

上一篇: 望夫石传说忠贞的象征, 下一篇:SQL连接中出现:"SQL Server不存在或访问被.

在线评论
姓名:
电话:
出发人数:
出发日期:
出游线路:
电子邮件:
通讯地址:
其它要求:
验证码:
关于我们 | 广告服务 | 联系我们 | 招聘信息 | 公司地址 | 汇款帐号 | 网站律师 | 网站地图 | 更多友情链接 | 
技术支持:爱威海旅游网 版权所有:威海微网信息技术服务有限公司 备案号: 鲁ICP备15008125号-3 爱威海旅游网热线:15666315157  www.awhly.com 威海旅游网