巧用DAC解決SQL Server登錄失敗的問(wèn)題
連接SQL Server數(shù)據(jù)庫(kù)的時(shí)候,使用window身份登錄,提示連接失敗,我們這時(shí)候可以巧用DAC登錄來(lái)解決,首先對(duì)登錄失敗過(guò)程進(jìn)行了說(shuō)明,以便于我們找出原因。
為了安全,我把sa用戶設(shè)置為禁用,又因?yàn)槲蚁朐跀?shù)據(jù)庫(kù)服務(wù)器上控制,只允許固定IP地址連接訪問(wèn),所以建立了一個(gè)觸發(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地址是另一臺(tái)服務(wù)器的IP地址,執(zhí)行該觸發(fā)器后,當(dāng)我在服務(wù)器上使用Windows身份登錄的時(shí)候,提示錯(cuò)誤“無(wú)法連接到機(jī)器名\實(shí)例名”,其他信息:由于執(zhí)行觸發(fā)器,登錄名“機(jī)器名\用戶”的登錄失敗。已將數(shù)據(jù)庫(kù)上下文更改為“master”。已將語(yǔ)言設(shè)置更改為簡(jiǎn)體中文(Microsoft SQL Server,錯(cuò)誤:17892)。
而我在另一臺(tái)服務(wù)器上登錄時(shí),因?yàn)榈卿泿ぬ?hào)只能訪問(wèn)SQL 服務(wù)器某一個(gè)數(shù)據(jù)庫(kù),所以登錄的時(shí)候也出現(xiàn)錯(cuò)誤:
無(wú)法連接到服務(wù)器XXX.XXX.XXX.XXX。
服務(wù)器:消息4064,級(jí)別16,狀態(tài)1。
[Microsoft][ODBC SQL Server Driver][SQL Server]無(wú)法打開(kāi)用戶默認(rèn)數(shù)據(jù)庫(kù)。登錄失敗。
各種提問(wèn),某大神告訴我用DAC登錄,老實(shí)說(shuō),孤陋寡聞了,第一次知道這個(gè),于是本機(jī)登錄,命令行方式下執(zhí)行sqlcmd -A -S sql服務(wù)器名,然后執(zhí)行刪除觸發(fā)器的腳本:
- DROP TRIGGER tr_LoginCheck ON ALL SERVER
但是詭異的是有錯(cuò)誤提示“消息 3701,級(jí)別 11,狀態(tài) 5,服務(wù)器 XXX,第 1 行 無(wú)法對(duì)觸發(fā)器'tr_LoginCheck' 執(zhí)行刪除,因?yàn)樗淮嬖冢蛘吣鷽](méi)有所需的權(quán)限。”
執(zhí)行:
- select * from sys.server_triggers
卻又沒(méi)有結(jié)果,嘗試著用客戶端登錄,卻又可以登錄了。
以上就是用DAC實(shí)現(xiàn)登錄的過(guò)程,如果你有更好的解決辦法,歡迎您與我們分享,謝謝!
【編輯推薦】