孤立用户故障排除 (SQL Server)

要登录到 Microsoft SQL Server 的实例,主体必须有一个有效的 SQL Server 登录名。 在身份验证过程中会使用此登录名,以验证是否允许主体连接到该 SQL Server 实例。 可在 sys.server_principals 目录视图和 sys.syslogins 兼容性视图中查看服务器实例上的 SQL Server 登录名。

SQL Server 登录名使用映射到 SQL Server 登录名的数据库用户访问各个数据库。 此规则有两种例外情况:

  • guest 帐户。

    这个帐户在数据库中启用后,能够使未映射到数据库用户的 SQL Server 登录名作为 guest 用户进入数据库。

  • Microsoft Windows 组成员身份。

    如果某 Windows 用户是 Windows 组的成员,并且此组也是数据库中的用户,则基于该 Windows 用户创建的 SQL Server 登录名可以进入数据库。

有关 SQL Server 登录名与数据库用户的映射关系的信息存储在数据库中。 其中包括数据库用户的名称以及对应 SQL Server 登录名的 SID。 该数据库用户的权限用于在数据库中进行授权。

在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例。 这样的用户被称为此服务器实例上的数据库的“孤立用户”。 如果删除了对应的 SQL Server 登录名,则数据库用户可能会变为孤立用户。 另外,在数据库还原或附加到 SQL Server 的其他实例之后,数据库用户也可能变为孤立用户。 如果未在新服务器实例中提供数据库用户映射到的 SID,则该用户可能变为孤立用户。

注意注意

如果 SQL Server 登录名在某个数据库中没有对应的数据库用户,则除非该数据库中启用了 guest,否则,该登录名将无法访问该数据库。 有关创建数据库用户帐户的信息,请参阅 CREATE USER (Transact-SQL)

检测孤立用户

若要检测孤立用户,请执行下列 Transact-SQL 语句:

USE <database_name>;
GO; 
sp_change_users_login @Action='Report';
GO;

输出中列出了当前数据库中未链接到任何 SQL Server 登录名的用户以及对应的安全标识符 (SID)。 有关详细信息,请参阅 sp_change_users_login (Transact-SQL)

注意注意

sp_change_users_login 不能与从 Windows 中创建的 SQL Server 登录名一起使用。

解决孤立用户问题

若要解决孤立用户问题,请执行以下过程:

  1. 以下命令将重新链接 <login_name> 指定的服务器登录帐户与 <database_user> 指定的数据库用户。

    USE <database_name>;
    GO
    sp_change_users_login @Action='update_one', @UserNamePattern='<database_user>', 
       @LoginName='<login_name>';
    GO
    

    有关详细信息,请参阅 sp_change_users_login (Transact-SQL)

  2. 运行上述步骤中的代码后,该用户就可以访问数据库了。 该用户随后可以使用 sp_password 存储过程来更改 <login_name> 登录帐户的密码,如下所示:

    USE master 
    GO
    sp_password @old=NULL, @new='password', @loginame='<login_name>';
    GO
    
    安全说明安全说明

    只有具有 ALTER ANY LOGIN 权限的登录帐户才能更改其他用户的登录密码。 但是,只有 sysadmin 角色的成员才能修改 sysadmin 角色成员的密码。

    注意注意

    sp_password 不能用于 Microsoft Windows 帐户。 通过 Windows 网络帐户连接到 SQL Server 实例的用户是由 Windows 进行身份验证的,因此其密码只能在 Windows 中更改。

    有关详细信息,请参阅 sp_password (Transact-SQL)

请参阅

参考

CREATE USER (Transact-SQL)

CREATE LOGIN (Transact-SQL)

sp_change_users_login (Transact-SQL)

sp_addlogin (Transact-SQL)

sp_grantlogin (Transact-SQL)

sp_password (Transact-SQL)

sys.sysusers (Transact-SQL)

sys.syslogins (Transact-SQL)