我的数据库中有一个用户没有关联的登录信息。它似乎是在没有登录的情况下创建的。
每当我尝试使用此用户连接到数据库时,我都会收到以下错误:
Msg 916, Level 14, State 1, Line 1
The server principal "UserName" is not able to access the database
"DatabaseName" under the current security context.
我想为此用户指定一个登录名,以便我可以实际使用它来访问数据库。我已尝试使用以下脚本将登录与用户关联。
USE [DatabaseName]
ALTER USER [UserName]
WITH LOGIN = [UserName]
但是这给了我以下错误:
Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users
that were mapped to Windows or SQL logins.
有什么办法可以为这个用户分配登录信息吗?我不想从头开始,因为这个用户有很多需要重新设置的权限。
编辑:以回应Philip Kelley的提问,这是我运行select * from sys.database_principals where name = 'username'
时得到的结果。
对于图片大小的抱歉,您需要在新标签页中打开它才能正确查看。
EDIT2:
好的,我已经按照gbn的建议放弃了现有的LOGIN,我正在使用以下脚本创建一个与用户具有相同SID的新LOGIN。
CREATE LOGIN [UserName]
WITH PASSWORD=N'Password1',
DEFAULT_DATABASE=[DatabaseName],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF,
SID=0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390
现在它给出了以下错误消息,看来SID对于LOGIN的SID字段来说太长了。
Msg 15419, Level 16, State 1, Line 1
Supplied parameter sid should be binary(16).
我没有划桨就上了小河吗?
答案 0 :(得分:44)
sp_change_users_login
已被弃用。
更容易:
ALTER USER usr1 WITH LOGIN = login1;
答案 1 :(得分:34)
我发现这个问题仍然有用,但在我的案例中没有明确回答。
将SQL Server 2012与孤立的SQL_USER一起使用,这就是修复;
USE databasename -- The database I had recently attached
EXEC sp_change_users_login 'Report' -- Display orphaned users
EXEC sp_change_users_login 'Auto_Fix', 'UserName', NULL, 'Password'
答案 2 :(得分:9)
您有一个孤立用户,但由于没有登录地址,因此无法使用ALTER USER重新映射。因此,您需要先运行CREATE LOGIN。
如果数据库级用户是
然后运行ALTER USER
在评论和更新之后编辑
sys.database_principals中的sid用于Windows登录。
因此,尝试创建并重新映射到SQL登录将失败
运行此命令以获取Windows登录信息
SELECT SUSER_SNAME(0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390)
答案 3 :(得分:2)
通过反复试验,似乎最初创建了用户"没有登录"然后这个查询
select * from sys.database_principals
将显示authentication_type = 0(NONE)。
显然,由于此命令,这些用户无法重新链接到任何登录(预先存在或新的,SQL或Windows):
alter user [TempUser] with login [TempLogin]
回复Remap Error" Msg 33016"在问题中显示。
这些用户也不会出现在经典(弃用)SP报告中:
exec sp_change_users_login 'Report'
如果有人知道如何解决此问题或如何更改authentication_type,请发表评论。
答案 4 :(得分:0)
它是什么类型的数据库用户?在数据库中运行select * from sys.database_principals
,然后检查type
列type_desc
和name
。如果它是Windows或SQL用户,请使用@ gbn的答案,但如果是其他内容(这是我根据您的错误消息未经测试的猜测),那么您会遇到其他问题。
修改
因此它是经过SQL身份验证的登录。我们使用sp_change_users_login
来修复此类登录时返回。 SQL 2008将其称为“不使用,将被弃用”,这意味着ALTER USER命令应该足够......但在这种情况下可能值得一试。使用得当(已经有一段时间了),我相信这会更新用户的SID以匹配登录的SID。
答案 5 :(得分:0)
为用户创建登录名
使用您创建的登录名拖放并重新创建用户。
还有其他主题,讨论如何复制用户的权限。 我建议您趁此机会在角色中定义这些权限,然后调用sp_addrolemember将用户添加到角色中。