我們最近在暫存和生產環境中遇到了一個奇怪的問題。我們已經運行SQL Server 2005上的存儲過程的更新腳本,驗證了新的更改,並開始在我們的產品上使用它。過了一段時間後,相同的存儲過程從數據庫中丟失了。除了我們打算使用的任何其他任務外,此存儲過程未被使用。我們已經檢查了代碼和部署腳本的所有內容,但是僅僅刪除存儲過程就找不到跟蹤。存儲過程隨機丟棄
在我們的DEV和QA環境中不會發生此問題,但僅在階段和生產階段。
有人可以幫忙嗎?
親切的問候,
Mafaz
我們最近在暫存和生產環境中遇到了一個奇怪的問題。我們已經運行SQL Server 2005上的存儲過程的更新腳本,驗證了新的更改,並開始在我們的產品上使用它。過了一段時間後,相同的存儲過程從數據庫中丟失了。除了我們打算使用的任何其他任務外,此存儲過程未被使用。我們已經檢查了代碼和部署腳本的所有內容,但是僅僅刪除存儲過程就找不到跟蹤。存儲過程隨機丟棄
在我們的DEV和QA環境中不會發生此問題,但僅在階段和生產階段。
有人可以幫忙嗎?
親切的問候,
Mafaz
如果您已經排除了明顯的(例如故意破壞),那麼我建議不必通過sys.sql_modules
對於此程序的參考一看 - 可能有一個意外失誤,如:
IF NOT EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME = 'Proc1')
DROP PROCEDURE Proc1
GO
CREATE PROC dbo.Proc1
AS
...
<< MISSING GO!
IF NOT EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME = 'Proc2')
DROP PROCEDURE Proc2
GO
CREATE PROC dbo.Proc2
AS
...
即上文所述,DROP PROCEDURE Proc2
代碼被附加INTO無關的定義,因爲Proc1
定義的末尾缺少GO
。每次運行Proc1
時,它都會丟棄proc Proc2
(如果Proc2
已被丟棄,則if exists
將不便地隱藏錯誤)。
同樣,另一個常見問題是將GRANT EXEC
留在PROC
的底部 - 如果權限不嚴格,這可能會破壞過程的性能。
這裏最好的建議是以最小的權限執行應用程序,以便它不能執行DDL
,如DROP
或GRANT
。這樣,當執行Proc1
時,應用程序將中斷,使您能夠快速追蹤違規代碼。
我不相信你的答案,直到它發生在我身上! –
你調查了你的日誌/事件查看器嗎? – Jade
嗨Jade,感謝您的建議,無法追查任何可疑物品。 但是,嘿@StuartLC先生,感謝一個BUNCH,我可以通過您提供的sys.sqlmodules來追蹤錯誤,正如您所預料的那樣,錯誤在於在部署腳本中有一個在創建一個前一個SP時導致在前一個SP中包含DROP語句時,在所涉及的SP的後續拖放語句之前丟失了一個GO關鍵字。非常感謝...非常感謝。 – sm2mafaz