孤立用户故障排除

要登录到 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. 以下命令将重新链接 <登录名> 指定的服务器登录帐户与 <数据库用户> 指定的数据库用户。

    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 存储过程来更改 <登录名> 登录帐户的密码,如下所示:

    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)