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

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

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

  • guest 帐户。

    这是一个帐户,在数据库中启用后,允许未映射到数据库用户的SQL Server登录名以来宾用户身份输入数据库。

  • Microsoft Windows 组成员身份。

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

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

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

注意

SQL Server登录名无法访问缺少相应数据库用户的数据库,除非在该数据库中启用了来宾。 有关创建数据库用户帐户的信息,请参阅 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)