为没有登录的用户分配登录名(SQL Server)

时间:2011-06-24 13:55:23

标签: sql-server sql-server-2008

我的数据库中有一个用户没有关联的登录信息。它似乎是在没有登录的情况下创建的。

每当我尝试使用此用户连接到数据库时,我都会收到以下错误:

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'时得到的结果。

SQL User

对于图片大小的抱歉,您需要在新标签页中打开它才能正确查看。

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).

我没有划桨就上了小河吗?

6 个答案:

答案 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

如果数据库级用户是

  • Windows登录,映射将通过AD SID自动修复
  • SQL登录,使用sys.database_principals中的“sid”作为登录的SID选项

然后运行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,然后检查typetype_descname。如果它是Windows或SQL用户,请使用@ gbn的答案,但如果是其他内容(这是我根据您的错误消息未经测试的猜测),那么您会遇到其他问题。


修改

因此它是经过SQL身份验证的登录。我们使用sp_change_users_login来修复此类登录时返回。 SQL 2008将其称为“不使用,将被弃用”,这意味着ALTER USER命令应该足够......但在这种情况下可能值得一试。使用得当(已经有一段时间了),我相信这会更新用户的SID以匹配登录的SID。

答案 5 :(得分:0)

为用户创建登录名

使用您创建的登录名拖放并重新创建用户。

还有其他主题,讨论如何复制用户的权限。 我建议您趁此机会在角色中定义这些权限,然后调用sp_addrolemember将用户添加到角色中。