我有一个数据库tom,后来还原远程下载的数据库的备份文件tom2.bak,还原到tom2。
我有一个用户hongda,他映射 表tom的几个权限。因为对tom2无任何权限,所以现在给他加同样的权限到tom2数据库上,但出现如下报错:
标题: Microsoft SQL Server Management Studio
------------------------------创建 对于 用户“hongda”失败。  (Microsoft.SqlServer.Smo)有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.4000.0+((KJ_PCU_Main).120628-0827+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=创建+User&LinkId=20476------------------------------
其他信息:执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)------------------------------用户、组或角色 'hongda' 在当前数据库中已存在。 (Microsoft SQL Server,错误: 15023)有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=15023&LinkId=20476------------------------------
按钮:确定
------------------------------
创建失败角色已存在

解决方案 »

  1.   

    --#1.tom2.bak备份时,应该把帐户也一同备份了。你看一下tom2的安全性中是否已经有hongda这个帐户?
    --#2.但备份还原后,这些帐户已经成为了孤立帐户。修复方法如下:
    用sp_change_users_login消除Sql Server的孤立用户 孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。 
    孤立帐户的产生一般是一下两种: 1.将备份的数据库在其它机器上还原; 2.重装系统或SQL SERVER之后只还原了用户库 
    解决方法是使用sp_change_users_login来修复。 
    sp_change_users_login的用法有三种 
    用法1: exec sp_change_users_login 'REPORT' 
    列出当前数据库的孤立用户 
    用法2: exec sp_change_users_login 'AUTO_FIX','用户名' 
    可以自动将用户名所对应的同名登录添加到syslogins中 
    用法3: exec sp_change_users_login 'UPDATE_ONE','用户名','登录名' 将用户名映射为指定的登录名
      

  2.   


    后来加上去了,不过修改的是“数据库/属性/权限”,然后在重新修改hongda的用户映射。
    这里一般是怎么选择角色(数据库角色成员身份):
      

  3.   

    一般的一般,选db_owner,除非有什么特殊要求。
      

  4.   

    果断db_owner,数据库的所有权限。呵呵
      

  5.   


    我发现这样也会弹出(不是来自备份文件创建的数据库):
    用户hongda原先映射了 数据库tom,后来修改映射 数据库 tom2。但是每次我修改他们的属性:安全性 → 登录名 → hongda → 属性 → 用户映射,只要修改 用户“数据库角色成员身份”救会报错这个。非得先去数据库中先右键【数据库】属性不给用户任何权限,然后再去安全性那里修改用户的属性。似乎只有这样才可以修改了。没有别的方法吗?
      

  6.   


    我发现这样也会弹出(不是来自备份文件创建的数据库):
    用户hongda原先映射了 数据库tom,后来修改映射 数据库 tom2。但是每次我修改他们的属性:安全性 → 登录名 → hongda → 属性 → 用户映射,只要修改 用户“数据库角色成员身份”救会报错这个。非得先去数据库中先右键【数据库】属性不给用户任何权限,然后再去安全性那里修改用户的属性。似乎只有这样才可以修改了。没有别的方法吗?

    不好意思,#6楼我的回复 描述错误了。现在问题是修改不了hongda的对tom、tom2的权限了。两个都报这个错了
      

  7.   

    我来试着解释一下,这个现象:
    #1.SQL SERVER有一个登陆名叫hongda,登陆名跟任何数据库都没有关系。
    #2.在数据库tom中,也有一个帐户名叫hongda,它只属于tom这个数据库。
    #3.在数据库tom2中,也有一个帐户名叫hongda,它只属于tom2这个数据库。(当然我们先不管这个hongda是不是孤立帐户)
    #4.本来上而#1,#2,#3中的3个hongda是没有任何关系的。但为了达到下面这个目的:一个user用hongda登陆SQL SERVER,并能控制它对tom和tom2数据库的操作权限。就会这样:把#2中的hongda和#1中的hongda映射一下,把#3中的hongda和#1中的hongda映射一下。这样,用#1中的hongda登陆后,由于映射了两个数据库中的hongda,就具有了#2,#3数据库中hongda的所有操作权限。
    #5.上面说了下原理。下面来说下你的现象:每次我修改他们的属性:安全性 → 登录名 → hongda → 属性 → 用户映射,只要修改 用户“数据库角色成员身份”救会报错这个。这时你的操作是:把#1中的hongda映射到tom和tom2中的hongda,由于这儿操作是:给tom及tom2创建一个名字为hongda的数据库级别的用户名,然后赋予,下面选中的权限:由于tom库已经正常映射过了,就不动它;tom2在创建时,发现hongda这个帐户已经存在,那就打算把它删除重建,但如果这时,tom2.hongda这个帐户还具有权限,就无法删除。所以,提示你,帐户已存在。而你把它的权限都去掉后,就可以被删除重建了。
      

  8.   

    不对呀,创建了映射后。可以随便改数据库级别hongda帐户的权限。不管是从映射界面改,还是在数据库中单击右键-》属性-》权限中改,还是在数据库-》安全-》hongda-》右键属性中改。