孤立用户疑难解答 (SQL Server)

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

SQL Server 登录名通过映射到该登录名的数据库用户来访问单个数据库。 此规则有两个例外:

  • 来宾帐户。

    这是一个帐户,当在数据库中启用时,可以让没有映射至数据库用户的 SQL Server 登录名作为来宾用户进入数据库。

  • Microsoft Windows 组成员身份。

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

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

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

注释

除非在该数据库中启用了 guest 用户,否则 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)。

另请参阅

创建用户 (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)