被遺棄使用者疑難排解 (SQL Server)

若要登入 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)>。

請參閱

參考

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)