共用方式為


MSSQLSERVER_17892

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 17892
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 SRV_LOGON_FAILED_BY_TRIGGER
訊息文字 登入登入名稱>因為<觸發程式執行而失敗。

說明

當登入觸發程式代碼無法順利執行時,就會引發錯誤 17892。 登入觸發程式會 引發預存程式,以回應LOGON事件。 當 SQL Server 執行個體建立使用者工作階段時,就會引發這個事件。 如下的錯誤訊息會回報給使用者:

Msg 17892、層級 14、狀態 1、伺服器 <伺服器名稱>、第 1 行
登入登入名稱>因為<觸發程式執行而失敗。

可能的原因

如果針對該特定使用者帳戶執行觸發程式代碼時發生錯誤,就會發生此問題。 部分案例包括:

  • 觸發程式會嘗試將數據插入不存在的數據表中。
  • 登入對登入觸發程式所參考的對象沒有許可權。

使用者動作

您可以根據您位於的案例,使用下列其中一個解決方案。

  • 案例 1:您目前具有系統管理員帳戶下 SQL Server 開啟會話的存取權

    在此情況下,您可以採取修正觸發程式碼所需的更正動作。

    • 範例 1:如果觸發程式代碼所參考的物件不存在,請建立該物件,讓登入觸發程式可以順利執行。

    • 範例 2:如果觸發程式代碼所參考的物件確實存在,但使用者沒有許可權,請授與他們存取物件的必要許可權。

    或者,您可以直接卸除或停用登入觸發程式,讓使用者可以繼續登入 SQL Server。

  • 案例 2:您沒有任何目前在系統管理員許可權下開啟的會話,但 SQL Server 上已啟用專用系統管理員連線(DAC)。

    在此情況下,您可以使用 DAC 連線來採取與案例 1 中所討論相同的步驟,因為 DAC 連線不受登入觸發程序影響。 如需 DAC 連線的詳細資訊,請參閱: 資料庫管理員的診斷連線。

    若要檢查 SQL Server 上是否啟用 DAC,您可以檢查 SQL Server 錯誤記錄檔中是否有類似下列訊息的訊息:

    2020-02-09 16:17:44.150 伺服器專用系統管理員連線支援已建立,以在埠 1434 本機接聽。

  • 案例 3:您既未在伺服器上啟用 DAC,也沒有 SQL Server 的現有管理員會話。

    在此案例中,補救問題的唯一方法是採取下列步驟:

    1. 停止 SQL Server 和相關服務。

    2. 使用啟動參數、 -m-f,從命令提示字元-c啟動 SQL Server。 這樣做會停用登入觸發程式,並可讓您執行上述案例 1討論的相同補救量值。

      注意

      上述程式需要 SA 或對等的系統管理員帳戶。

      如需這些和其他啟動選項的詳細資訊,請參閱:資料庫引擎 服務啟動選項

其他相關資訊

另一個登入觸發程式失敗的情況是使用 函 EVENTDATA 式。 此函式會傳回 XML 及其區分大小寫。 因此,您可以建立下列登入觸發程式,打算根據IP位址封鎖存取,而遇到問題:

 CREATE TRIGGER tr_logon_CheckIP  
 ON ALL SERVER  
 FOR LOGON  
 AS
 BEGIN
  IF IS_SRVROLEMEMBER ( 'sysadmin' ) = 1  
     BEGIN
         DECLARE @IP NVARCHAR ( 15 );  
         SET @IP = ( SELECT EVENTDATA ().value ( '(/EVENT_INSTANCE/ClientHost)[1]' , 'NVARCHAR(15)' ));  
         IF NOT EXISTS( SELECT IP FROM DBAWork.dbo.ValidIP WHERE IP = @IP )  
         ROLLBACK ;  
     END ;  
 END ;  
 GO

在觸發程式的這個部分從因特網複製此腳本時,用戶並未維持案例:

 SELECT EVENTDATA().value ( '(/event_instance/clienthost)[1]' , 'NVARCHAR(15)');

因此, EVENTDATA 一律會傳 回 NULL,而且所有 SA 對等登入都遭到拒絕存取。 在此情況下,DAC 連線並未啟用,因此我們別無選擇,而是使用上面所列的啟動參數重新啟動伺服器,以卸除觸發程式。