首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 登入觸發器錯誤導致無法連線?專用管理員連接 (DAC) 救援指南

     編輯:關於SqlServer

問題現象

建立 LOGON 觸發器且程式碼有誤 (如參考不存在物件) 時,所有正常登入嘗試皆會失敗,錯誤訊息:
登入失敗,觸發器執行錯誤...

登入觸發器錯誤畫面

觸發器錯誤範例

CREATE TRIGGER BadLogonTrigger ON ALL SERVER FOR LOGON
AS
BEGIN
    INSERT INTO BadDB.dbo.SomeTable VALUES ('Test'); -- BadDB 不存在
END;
GO

兩種解決路徑

方法一:現有有效連線 (若尚未中斷)

  • 若有其他 SSMS 視窗 / 應用程式連線仍存活且擁有 ALTER ANY SERVER TRIGGER 或 CONTROL SERVER 權限,直接執行:
DISABLE TRIGGER BadLogonTrigger ON ALL SERVER;
-- 或
DROP TRIGGER BadLogonTrigger ON ALL SERVER;

方法二:專用管理員連接 (DAC) - 終極後門

DAC 專為「無法正常連線時」提供最小資源、跳過登入觸發器的緊急連線。

啟用條件

  • 預設僅允許**本機**使用 DAC。遠端需啟用 sp_configure 'remote admin connections', 1; RECONFIGURE;。
  • 需為 sysadmin 固定伺服器角色成員。

連線方式

工具連線字串 / 參數
SSMS伺服器名稱輸入 ADMIN:ServerName 或 ADMIN:IP,Port
sqlcmdsqlcmd -A -S ServerName -U sa -P password (-A 參數啟用 DAC)

SSMS 使用 ADMIN: 連線

DAC 連線後修復

-- 刪除錯誤觸發器
DROP TRIGGER BadLogonTrigger ON ALL SERVER;
GO

-- 或暫時停用
DISABLE TRIGGER BadLogonTrigger ON ALL SERVER;
GO

預防最佳實務

  • 觸發器程式碼**上線前務必在測試環境完整驗證**。
  • 觸發器內使用 TRY...CATCH 捕獲例外,避免未處理錯誤中斷登入。
  • 避免在 LOGON 觸發器中執行跨資料庫/長時間操作。
  • 定期備份 master 資料庫,包含伺服器級觸發器定義。
  • 文件化 DAC 連線資訊 (IP、埠、sysadmin 帳號) 供緊急使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved