sqlserver 添加用户时报错:该登陆已用另一个用户名开立账户
有时候,当你使用现有登录名向当前数据库添加用户时,会收到这样的错误:
15063: The login already has an account under a different user name.
这时,你会查看该登录账号的登录属性的用户映射,却发现,该用户在数据库中的映射用户为dbo!
一般来说,我们希望用户名与登录账号保持一致,以便管理和维护;另外,我们还希望dbo的映射登录名为sa,而不是某个用户创建的登录名,因为,当你要删除这个登录账号的时候,会收到这样的错误:
15174: Login 'OBAMA' owns one or more database(s). Change the owner of the database(s) before dropping the login.
然后,你尝试在登录属性对话框中更改已映射的用户名dbo更改为登录名:
却收到这样的错误:
15150: Cannot alter the user 'dbo'.
这时,百折不挠的你继续从数据库用户对话框想办法,却发现登录名是灰色的:
想求助于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) 收藏 举报
浙公网安备 33010602011771号