這是我的問題。我正在使用SQL Server 2014.我有一個ASP.Net Web應用程序,它接受來自用戶的字符串。該字符串被傳遞給存儲過程(SP),該存儲過程查詢查詢鏈接服務器的視圖。我的數據訪問層向我的業務對象返回一個數據表。如果有數據 - 輸入的字符串被認爲是有效的(它在鏈接的服務器上有匹配)。如果沒有數據,輸入的字符串被認爲是無效的(鏈接服務器上沒有匹配)。需要定期刪除並重新創建存儲過程?
那麼簡單,這裏是信息的路徑:
Web應用程序 - 存儲過程 - 視圖 - 鏈接服務器 - 表數據
顯然,這條道路是相反的,一旦執行查詢(和數據傳遞從表格並最終到網絡應用程序)。
這裏是它變得奇怪。自創建SP(今天是第二次)以來,在過去13個月中曾兩次沒有數據在VALID字符串輸入時返回到Web應用程序。要清楚的是,這個SP總是有效(除了這兩次)。但是,一旦失敗,它就不會運行,直到它被丟棄並重新創建。
所以,這裏是什麼工作:
- 查詢鏈接服務器,直接,並添加字符串到 WHERE子句。
- 直接查詢視圖,並將字符串添加到WHERE 子句中。
這裏是行不通:
- 輸入串入網絡的應用程序。
- 直接查詢SP,並將字符串作爲參數傳遞。
而且真的,真的很怪異的一部分:
兩次出現這種情況,刪除並重新創建存儲過程解決了這個問題。 SP如何運行數月,然後停止工作?那麼如何解決這個問題呢就是放棄並重新創建SP?
首先,這是爲什麼發生?還有很多其他的Web應用程序調用SP,它們調用視圖,調用從未失敗的SAME鏈接服務器。但一年兩次ONE SP失敗沒有明顯的原因 - 刪除並重新創建它解決了這個問題?
請幫忙 - 這真是令人困惑......請讓我知道你是否需要更多信息。
編輯
針對alroc的評論:
- 創建存儲過程並沒有什麼 做安全的腳本。任何可以訪問數據庫的用戶都可以訪問SP。
- 我是這裏唯一的DBA,所以沒有其他人「應該」更改DB上的任何 安全或權限。但是,如果他們在做 ,那麼我會在其他地方預期這些問題,因爲網絡應用程序 使用相同的SQL登錄(相同的連接字符串),適用於每個其他進程的 - 並且有數百個。
第二個編輯
針對beercohol的評論:
- 查詢不超時 - 它不返回任何結果幾乎瞬間。 超時設置爲30秒,接近 的閾值接近此閾值。
- 我運行了DBCC CheckDB,沒有發現錯誤。
- 我會在下次發生這種情況時嘗試重新編譯SP,但爲什麼執行計劃會定期對數百或數千個SP中的某個SP執行失敗?
創建SP的腳本是否也授予與其相關的任何安全性?如果是這樣,是否有人可能會「修復」安全性,並在這個過程中撤銷你的SP所依賴的東西? – alroc
@alroc我編輯了我的答案以迴應您的評論。 –
我會檢查兩件事 - 1)你確定查詢在返回「無數據」時沒有超時? 2)運行DBCC CHECKDB檢查數據庫是否損壞。 – beercohol