孤兒使用者疑難排解
若要登入 Microsoft SQL Server 執行個體,則主體必須提供有效的 SQL Server 登入。此登入是用於驗證處理序,可確認是否允許該主體連接到 SQL Server 的執行個體。伺服器執行個體上的 SQL Server 登入可以在 sys.server_principals 目錄檢視和 sys.syslogins 相容性檢視中看到。
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 未出現在新的伺服器執行個體中,則會遭到遺棄。
![]() |
---|
除非缺少對應資料庫使用者的資料庫中已啟用 guest,否則 SQL Server 登入無法存取該資料庫。如需建立資料庫使用者帳戶的詳細資訊,請參閱<CREATE USER (Transact-SQL)>。 |
若要偵測被遺棄使用者
若要偵測被遺棄使用者,請執行以下 Transact-SQL 陳述式:
USE <database_name>;
GO;
sp_change_users_login @Action='Report';
GO;
輸出會列出使用者及對應的安全性識別碼 (SID),這些使用者皆為目前資料庫中的使用者,且並未與任何 SQL Server 登入有連結。如需詳細資訊,請參閱<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)>。
請參閱
其他資源
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)