2014-03-19 46 views
3

我們最近在暫存和生產環境中遇到了一個奇怪的問題。我們已經運行SQL Server 2005上的存儲過程的更新腳本,驗證了新的更改,並開始在我們的產品上使用它。過了一段時間後,相同的存儲過程從數據庫中丟失了。除了我們打算使用的任何其他任務外,此存儲過程未被使用。我們已經檢查了代碼和部署腳本的所有內容,但是僅僅刪除存儲過程就找不到跟蹤。存儲過程隨機丟棄

在我們的DEV和QA環境中不會發生此問題,但僅在階段和生產階段。

有人可以幫忙嗎?

親切的問候,

Mafaz

+0

你調查了你的日誌/事件查看器嗎? – Jade

+1

嗨Jade,感謝您的建議,無法追查任何可疑物品。 但是,嘿@StuartLC先生,感謝一個BUNCH,我可以通過您提供的sys.sqlmodules來追蹤錯誤,正如您所預料的那樣,錯誤在於在部署腳本中有一個在創建一個前一個SP時導致在前一個SP中包含DROP語句時,在所涉及的SP的後續拖放語句之前丟失了一個GO關鍵字。非常感謝...非常感謝。 – sm2mafaz

回答

4

如果您已經排除了明顯的(例如故意破壞),那麼我建議不必通過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,如DROPGRANT。這樣,當執行Proc1時,應用程序將中斷,使您能夠快速追蹤違規代碼。

+1

我不相信你的答案,直到它發生在我身上! –