孤兒使用者疑難排解

若要登入 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 登入一起使用。

若要解析被遺棄使用者

若要解析被遺棄使用者,請使用以下程序:

  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)>。