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 的現有管理員會話。
在此案例中,補救問題的唯一方法是採取下列步驟:
停止 SQL Server 和相關服務。
使用啟動參數、
-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 連線並未啟用,因此我們別無選擇,而是使用上面所列的啟動參數重新啟動伺服器,以卸除觸發程式。