若要登录到某个 Microsoft SQL Server 实例,主体必须拥有服务器实例所提供的有效登录帐户。在身份验证过程中会使用此登录帐户,以验证是否允许主体连接到该 SQL Server 实例。服务器实例上的登录帐户可以在 sys.server_principals 目录视图和 sys.syslogins 兼容性视图中看到。
登录帐户将使用数据库中存在的用于该帐户的用户映射来访问各个数据库。此规则有两种例外情况:
-
guest 帐户。
当在数据库中启用此帐户时,意味着不具有用户映射的所有登录帐户都可以作为 guest 用户进入数据库。
-
Microsoft Windows 组成员身份。
对于任何一个数据库,如果 Windows 登录帐户所属的任何一组也是该数据库的用户,那么该登录帐户就可以进入该数据库。
其他所有登录帐户均要求登录帐户映射到的数据库定义相应的数据库用户帐户。保存在数据库中的映射信息包含用户名以及用户名映射到的登录帐户的 SID。此数据库用户帐户用于验证在数据库中的权限。
如果没有在服务器实例上为某个用户定义相应的登录帐户,或者定义不正确,那么即使数据库中的用户和权限不变,此用户也不能登录到该服务器实例。这样的用户被称为该服务器实例上的数据库的“孤立用户”。如果从服务器实例中删除某个数据库用户相应的登录帐户,该用户就会成为孤立用户。另外,还原数据库或将其附加到其他 SQL Server 实例之后,用户也会成为孤立用户。之所以会成为孤立用户,是因为数据库用户映射到的登录帐户 SID 在新的服务器实例中可能不存在。
如果给定登录帐户的用户不具有数据库用户帐户,该登录帐户就无法访问数据库(即使其用户可能能够连接到服务器实例),除非数据库包含 guest 用户帐户。有关创建数据库用户帐户的信息,请参阅 <link tabindex="" xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" keywords="01de7476-4b25-4d58-85b7-1118fe64aa80">。 |
检测孤立用户
若要检测孤立用户,请执行下列 Transact-SQL 语句:
USE <database_name>; GO; sp_change_users_login @Action='Report'; GO; |
输出结果将列出当前数据库中未链接到任何登录帐户的用户以及相应的安全性标识符 (SID)。有关详细信息,请参阅 <link tabindex="" keywords="1554b39f-274b-4ef8-898e-9e246b474333">。
sp_change_users_login 不能用于 Windows 登录帐户。 |
解决孤立用户问题
若要解决孤立用户问题,请执行以下过程:
-
以下命令将重新链接 <login_name> 指定的服务器登录帐户与 <database_user> 指定的
AdventureWorks
数据库用户。
复制代码有关详细信息,请参阅 <link tabindex="" keywords="1554b39f-274b-4ef8-898e-9e246b474333">。USE <database_name>; GO sp_change_users_login @Action='update_one', @UserNamePattern='<database_user>', @LoginName='<login_name>'; GO
-
运行上述步骤中的代码后,该用户就可以访问数据库了。该用户随后可以使用 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 中更改。 |
有关详细信息,请参阅 <link tabindex="" keywords="0ecbec81-e637-44a9-a61e-11bf060ef084">。