若要登录到 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 登录名一起使用。
解决孤立用户问题
若要解决孤立用户,请使用以下过程:
以下命令将服务器登录帐户<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)。
在上一步中运行代码后,用户可以访问数据库。 然后,用户可以使用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)