巧用DAC解決SQL Server登錄失敗的問題
連接SQL Server數據庫的時候,使用window身份登錄,提示連接失敗,我們這時候可以巧用DAC登錄來解決,首先對登錄失敗過程進行了說明,以便于我們找出原因。
為了安全,我把sa用戶設置為禁用,又因為我想在數據庫服務器上控制,只允許固定IP地址連接訪問,所以建立了一個觸發(fā)器,如下:
- USE master
- GO
- CREATE TRIGGER tr_LoginCheck
- ON ALL SERVER
- FOR LOGON
- AS
- IF EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(15)') <> '192.168.1.1'
- ROLLBACK TRAN
- GO
允許的IP地址是另一臺服務器的IP地址,執(zhí)行該觸發(fā)器后,當我在服務器上使用Windows身份登錄的時候,提示錯誤“無法連接到機器名\實例名”,其他信息:由于執(zhí)行觸發(fā)器,登錄名“機器名\用戶”的登錄失敗。已將數據庫上下文更改為“master”。已將語言設置更改為簡體中文(Microsoft SQL Server,錯誤:17892)。
而我在另一臺服務器上登錄時,因為登錄帳號只能訪問SQL 服務器某一個數據庫,所以登錄的時候也出現錯誤:
無法連接到服務器XXX.XXX.XXX.XXX。
服務器:消息4064,級別16,狀態(tài)1。
[Microsoft][ODBC SQL Server Driver][SQL Server]無法打開用戶默認數據庫。登錄失敗。
各種提問,某大神告訴我用DAC登錄,老實說,孤陋寡聞了,第一次知道這個,于是本機登錄,命令行方式下執(zhí)行sqlcmd -A -S sql服務器名,然后執(zhí)行刪除觸發(fā)器的腳本:
- DROP TRIGGER tr_LoginCheck ON ALL SERVER
但是詭異的是有錯誤提示“消息 3701,級別 11,狀態(tài) 5,服務器 XXX,第 1 行 無法對觸發(fā)器'tr_LoginCheck' 執(zhí)行刪除,因為它不存在,或者您沒有所需的權限。”
執(zhí)行:
- select * from sys.server_triggers
卻又沒有結果,嘗試著用客戶端登錄,卻又可以登錄了。
以上就是用DAC實現登錄的過程,如果你有更好的解決辦法,歡迎您與我們分享,謝謝!
【編輯推薦】