项目里面的一个问题,使用场景稍微那个什么了一点,望万能的CSDN赐我一个功力深厚的大牛帮助解决这个问题。问题描述
1. PC的硬盘有两个分区,SqlServer 2005是装在C盘的,出问题的数据库(下称MyDB)是装在D盘的。
2. 对MyDB专门创建了访问用户(MyDBUser),并且赋予了访问权限(db_datareader和db_datawriter)然后,做整个硬盘的Ghost镜像,把镜像烧到光盘,拿光盘到其它机器上恢复镜像,此时一切都运行的很好。
再然后,下面的步骤就出问题了:3. 再把恢复光盘放入PC,此时可以选择只恢复C盘还是恢复整个硬盘,假如说这个时候选择只恢复C盘的话(整个硬盘恢复是没有问题的),那么问题就出现了:
MyDBUser这个用户访问不了MyDBUser,用sa登录然后看MyDBUser的权限(Security->Logins->右键MyDBUser选Properties->选"User Mapping"页面,发现MyDBUser这个用户对MyDB的db_datareader和db_datawriter权限没了!小弟我百思不得其解,为什么访问权限没了呢?
1. 假如说这个访问权限是放在C盘,比如说存在其它数据库里面的,那么当我恢复C盘的时候,对D盘的数据库访问权限应该还是在的。
2. 假如说这个访问权限是放在D盘,比如说就是和MyUser这个数据库文件在一起,那么应该也还是能读到。那访问权限去哪儿了呢???
有没有好的方法去解决这个问题呢? 
分不是问题,问题是给分能不能解决问题:----------)

解决方案 »

  1.   

    貌似是SID的问题,Windows系统重新Ghost后,账号的sid会随着改变,这样会导致关联不上.lz你看看正常的跟非正常的principal_id,sid是否一致?SELECT * FROM sys.server_principals WHERE name='MyDBUser'
      

  2.   

    没看明白,你只恢复C盘,不恢复D盘,而你的myDB放在D盘,这样你的myDB库能有?
      

  3.   

    登录的权限数据应该放在master,你的sqlserver安装在C盘,如果没有修改安装配置,也就是master库放在C盘,你恢复C盘就恢复了所有的系统库,
    其他的原因参考2楼
      

  4.   

    应该是孤立用户的问题。查询
    SELECT DP.NAME AS  OrphanUser,DP.SID AS OrphanSid
    FROM SYS.DATABASE_PRINCIPALS DP
    LEFT JOIN SYS.SERVER_PRINCIPALS SP
    ON DP.SID=SP.SID
    WHERE SP.SID IS NULL
         AND DP.TYPE_DESC='SQL_USER'
         AND DP.PRINCIPAL_ID>4修复ALTER USER MyDBUser  WITH LOGIN=MyDBUser
      

  5.   

    感激涕零,衣衫已湿透在CSDN注册ID混迹多年,从未有帖子一下子得到如此多的“星级”大牛的关照马上去试,马上回来
      

  6.   

    我的想法跟楼主一样,如果不看2楼的,估计就over了
      

  7.   

    谢谢各位大牛的帮助,经过反复试验,终于弄出一点眉目了。
    问题正如您所述,是因为sid不一致(principal_id)是一致的。
    昨天有一点没有提到,当初也没想到,今天试了一下。就是我们是有软件有两个版本,版本1和版本2。当只用版本1,然后恢复C盘。或者只用版本2,然后恢复C盘,好像是没用问题的。问题就出在首先装版本1,然后用版本2的镜像还原C盘,这时候正如您所说sid会不一致,所以就发生问题了。
      

  8.   


    谢谢大牛支招,我用您的脚本跑了一下,发现查询出来都是没有记录。我猜想可能是这样的,对于MyDBUser,这个用户不仅能访问D盘的那个数据库,还能访问C盘的另外两个数据库(我们现在的软件用到几个数据库,就MyDB是在D盘,其它都在C盘,就是这个D盘的在上述场景出问题了)。