如何編寫腳本來殺死 MSSQL 中的 MS Office 數據庫鎖
我最近繼承了一個 MSSQL 數據庫,因為我們的 DBA 已經轉向更綠色的牧場。我不是 DBA,對 SQL 知識的了解有限,但不得不承擔他的一些職責,並且遇到了一個問題,我在導航時遇到了一些麻煩。
我們遇到了一個問題,即通過 Excel 訪問數據庫的使用者傾向於停止數據庫操作,這會影響我們的 ERP 軟體。我們目前的解決方法是查看 SSMS 中的活動監視器並殺死有問題的 Microsoft Office 應用程序。
我希望有一個腳本任務,每隔幾分鐘執行一次,以保持事情的順利進行,並且在系統出現故障時不會讓使用者湧向 IT。
我發現以下查詢將允許我提取鎖定類型和其他有用的數據,例如等待時間,但不能提取活動監視器中的特定應用程序。
select * from sys.dm_exec_requests where wait_type = 'LCK_M_S'
理想情況下,此程式碼將找到具有 LCK_M_S 的 wait_type 的應用程序 Microsoft Office 並終止等待時間最長的任務並在一天中根據需要重複。
預先感謝您的回复。
你可以看看
select session_id, program_name, host_name from sys.dm_exec_sessions
但是這些程序名稱可以由客戶端選擇,因此不能保證您可以辨識 Excel 會話。
更好的解決方案是查看您的 ERP 軟體是否支持 READ COMMITTED SNAPSHOT 隔離,並設置數據庫選項以防止 Excel 使用者需要共享鎖來執行查詢。
如果您可以找到導致您想要的問題的使用者的會話 ID,那麼您可以終止他們的會話(儘管不是特定的事務)
KILL 0
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/kill-transact-sql?view=sql-server-ver16
這裡還有一個問題可以幫助您停止搜尋會話,建議似乎是使用 DBCC,但這似乎不太自動化。
DBCC opentran()
https://stackoverflow.com/questions/6833867/close-kill-transaction
如果您可以控制 Excel 工作表的執行內容,則它們是只讀的,並且值是否有點錯誤也沒關係。您可以將此添加到查詢的頂部,它們不會阻止其他使用者
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED