sqlserver 添加用户时报错:该登陆已用另一个用户名开立账户

有时候,当你使用现有登录名向当前数据库添加用户时,会收到这样的错误:

15063 15174" name=image_operate_59451311000779086 alt="15150 15063 15174" src="http://s13.sinaimg.cn/middle/7d2afc6cga85919a80efc&690" width=554 height=163 action-type="show-slide" action-data="http%3A%2F%2Fs13.sinaimg.cn%2Fmiddle%2F7d2afc6cga85919a80efc%26690" real_src="http://s13.sinaimg.cn/middle/7d2afc6cga85919a80efc&690"> 

15063: The login already has an account under a different user name.

这时,你会查看该登录账号的登录属性的用户映射,却发现,该用户在数据库中的映射用户为dbo!

15063 15174" name=image_operate_66891311000779413 alt="15150 15063 15174" src="http://s10.sinaimg.cn/middle/7d2afc6cga8591e5e7df9&690" width=554 height=449 action-type="show-slide" action-data="http%3A%2F%2Fs10.sinaimg.cn%2Fmiddle%2F7d2afc6cga8591e5e7df9%26690" real_src="http://s10.sinaimg.cn/middle/7d2afc6cga8591e5e7df9&690">

一般来说,我们希望用户名与登录账号保持一致,以便管理和维护;另外,我们还希望dbo的映射登录名为sa,而不是某个用户创建的登录名,因为,当你要删除这个登录账号的时候,会收到这样的错误:

15063 15174" name=image_operate_51561311000770337 alt="15150 15063 15174" src="http://s15.sinaimg.cn/middle/7d2afc6cga8591e6dc87e&690" action-type="show-slide" action-data="http%3A%2F%2Fs15.sinaimg.cn%2Fmiddle%2F7d2afc6cga8591e6dc87e%26690" real_src="http://s15.sinaimg.cn/middle/7d2afc6cga8591e6dc87e&690">

15174: Login 'OBAMA' owns one or more database(s). Change the owner of the database(s) before dropping the login.

然后,你尝试在登录属性对话框中更改已映射的用户名dbo更改为登录名:

15063 15174" name=image_operate_74941311000711308 alt="15150 15063 15174" src="http://s9.sinaimg.cn/middle/7d2afc6cga8591e8c4978&690" width=554 height=449 real_src="http://s9.sinaimg.cn/middle/7d2afc6cga8591e8c4978&690">

却收到这样的错误:

15063 15174" name=image_operate_10661311000769726 alt="15150 15063 15174" src="http://s8.sinaimg.cn/middle/7d2afc6cga8591e9b7f77&690" width=554 height=163 real_src="http://s8.sinaimg.cn/middle/7d2afc6cga8591e9b7f77&690">

15150: Cannot alter the user 'dbo'.

这时,百折不挠的你继续从数据库用户对话框想办法,却发现登录名是灰色的:

15063 15174" name=image_operate_52801311000743156 alt="15150 15063 15174" src="http://s16.sinaimg.cn/middle/7d2afc6cga8591eba105f&690" width=554 height=449 real_src="http://s16.sinaimg.cn/middle/7d2afc6cga8591eba105f&690">

 

想求助于Google,却不知道如何描述?那么就先执行这个语句:

alter authorization on database::DATABASE_NAME to sa

问题解决了!

 

如果有兴趣的话,下面的步骤可以重现刚才的问题:

 

Step 01: 作为sa连接到SQL Instance,执行以下的脚步,创建登录账号OBAMA,赋予其创建数据库的权限,扮演登录账号OBAMA,创建数据库,并在数据库中创建表:

create login OBAMA with password='Barack', check_policy=OFF

exec sp_addsrvrolemember @loginame='OBAMA',@rolename='dbcreator'

exec as login='OBAMA'

select system_user as current_login

create database ThePentagon

Go

use ThePentagon

create table succession_box(

 idx         int identity

,time_period varchar(20)

,event       varchar(128))

insert succession_box(time_period,event) select '2007–','Chairman of the Senate Foreign Relations Subcommittee on European Affairs'

insert succession_box(time_period,event) select '2009','Nobel Peace Prize Laureate'

insert succession_box(time_period,event) select '2009–present','President of the United States'

select * from ThePentagon.dbo.succession_box

 

Step 02: 恢复sa身份,尝试映射登录账号到数据库用户,删除登录账号,操作失败:

revert

select system_user as current_login

create user OBAMA from login OBAMA

drop login OBAMA

 

Step 03: 使用sa身份,查看系统目录,发现数据库用户dbo被映射到了登录账号OBAMA,数据库的所有者为OBAMA:

select dp.name as user_name,sp.name as login_name

   from ThePentagon.sys.database_principals as dp

   join sys.server_principals as sp on sp.sid=dp.sid

   where dp.name='dbo'

select d.name as db_name,sp.name as owner_login_name

   from sys.databases as d

   join sys.server_principals as sp on sp.sid=d.owner_sid

   where d.name='ThePentagon'

 

Step 04: 使用sa身份,将数据库的所有者改为sa,这时,OBAMA不再拥有访问数据库的权限,可以通过创建数据库用户、添加角色成员的方式赋予OBAMA对数据库的访问,甚至可以删除登录账号OBAMA:

alter authorization on database::ThePentagon to sa

select dp.name as user_name,sp.name as login_name

   from ThePentagon.sys.database_principals as dp

   join sys.server_principals as sp on sp.sid=dp.sid

   where dp.name='dbo'

select d.name as db_name,sp.name as owner_login_name

   from sys.databases as d

   join sys.server_principals as sp on sp.sid=d.owner_sid

   where d.name='ThePentagon'

use ThePentagon

create user OBAMA from login OBAMA

exec sp_addrolemember @rolename='db_owner',@membername='OBAMA'

exec as login='OBAMA'

select system_user as current_login

select * from ThePentagon.dbo.succession_box

revert

drop login OBAMA

posted on 2014-05-13 14:45  temp_hello_W0rd  阅读(2890)  评论(0)    收藏  举报

导航