项目里面的一个问题,使用场景稍微那个什么了一点,望万能的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. 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这个数据库文件在一起,那么应该也还是能读到。那访问权限去哪儿了呢???
有没有好的方法去解决这个问题呢?
分不是问题,问题是给分能不能解决问题:----------)
其他的原因参考2楼
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
问题正如您所述,是因为sid不一致(principal_id)是一致的。
昨天有一点没有提到,当初也没想到,今天试了一下。就是我们是有软件有两个版本,版本1和版本2。当只用版本1,然后恢复C盘。或者只用版本2,然后恢复C盘,好像是没用问题的。问题就出在首先装版本1,然后用版本2的镜像还原C盘,这时候正如您所说sid会不一致,所以就发生问题了。
谢谢大牛支招,我用您的脚本跑了一下,发现查询出来都是没有记录。我猜想可能是这样的,对于MyDBUser,这个用户不仅能访问D盘的那个数据库,还能访问C盘的另外两个数据库(我们现在的软件用到几个数据库,就MyDB是在D盘,其它都在C盘,就是这个D盘的在上述场景出问题了)。