有沒有一種方法,把一個數據庫進入單用戶模式時,指定用戶(在我的情況下,它是當前用戶),和以確保即使在用戶斷開連接之後,單個會話仍保留給該定義的用戶;即它真的是單用戶而不是單用戶?
背景
給予一定的背景下...
我們有一些腳本來刷新我們的測試環境中的數據。 最近一次失敗,顯示錯誤,指出運行腳本的用戶帳戶無權訪問數據庫。 在調查中,用戶是數據庫上的系統管理員;所以這顯然不是真的。 但是,我發現該腳本將數據庫置入Single User
模式。 查看數據庫上的活動會話時,我可以看到單個用戶與預期的帳戶不同(而是另一個屬於系統的間歇性輪詢此數據庫的服務帳戶)。 我的假設是出現以下情況:
- 腳本運行作爲用戶A
- 腳本把DB到單用戶模式
- 腳本執行一些查詢/ IES
- 腳本關閉,同時做一些其他的任務,當前連接
- UserB嘗試連接到數據庫; UserA會話現在關閉成功
- UserB的會話保持打開狀態(因爲UserB是具有連接池的服務,即使操作完成後會話保持打開狀態)。
- UserA嘗試重新連接到DB;訪問被拒絕,因爲UserB採取單一會話
存在各種可能的解決方案。
- 重寫劇本,以保持持久連接(可能很多的努力特別是我不熟悉的代碼)
- 禁用所有服務,這可能會嘗試連接間歇性(有點違背了使用一個點單用戶模式/還有很多額外的努力來調查所有可能連接的賬戶,並保持這一點)
- 添加一個捕獲腳本來殺死競爭的SPIDs,從而回收單用戶會話(我不像殺死SPIDs,因爲這會影響交易完整性)
- 使用魔法(即查看接受的問題答案; h opefully)
更新
代碼使用PowerShell的Invoke-SqlCmd
,其創建和刪除每一個命令運行連接;因此,只要數據庫處於單用戶模式,連接就會丟失。 我查看了這個命令參數,看看是否有連接池/持久連接的選項,但最接近的我可以找到的是DedicatedAdministratorConnection
,儘管我最初的希望似乎我應該避開(http://www.brentozar.com/archive/2011/08/dedicated-admin-connection-why-want-when-need-how-tell-whos-using/)。