2015-01-07 67 views
0

我有一個存儲過程在客戶端使用系統時被刪除,並且他們無法訪問數據庫。所以他們不能手動刪除它正在刪除SQL Server存儲過程

我看到很多人說,它可能是IF EXISTS... DROP PROC聲明之前缺少的GO,但是這個程序在我們運行腳本更新數據庫的時刻並沒有消失,它正在在用戶使用系統時刪除。在C#代碼中沒有DROP。所以我不知道發生了什麼。 有什麼可以放棄它?

+0

你有鏡像或複製設置的任何級別? – Ruskin

+0

不,我不知道。我只能認爲某種類型的C#異常正在這樣做 – Mucida

+0

您應該查詢在SQL服務器上運行的默認跟蹤,以查看誰在刪除它 – sqlhdv

回答

4

我想那些說「GO」缺失的人意味着IF EXISTS DROP現在嵌入到某個存儲過程中。這可以解釋爲什麼當人們使用系統時它消失了,而不是在運行更新腳本時(因爲IF EXISTS DROP是proc定義的一部分並且不能立即運行)。運行以下命令:

SELECT * 
FROM sys.sql_modules 
WHERE [definition] LIKE N'%DROP_%PROC%'; 
-- Use _% between the words to account for whitespace variations but still require 
-- at least one character 

在該數據庫中查看是否有任何內容顯示。

爲了解釋發生了什麼事,你的腳本如下所示:

// a bunch of SQL statements 

GO 
IF EXISTS(...SomeProc1) 
    DROP PROC dbo.SomeProc1; 
GO 
CREATE PROC dbo.SomeProc1 
AS 
.... 

// oops, no GO here 

IF EXISTS(...SomeProc2) 
    DROP PROC dbo.SomeProc2; 
GO 
CREATE PROC dbo.SomeProc2 
AS 
.... 

GO 

因爲沒有「GO」的CREATE PROC dbo.SomeProc1IF EXISTS(...SomeProc2)之間的IF EXISTS(...SomeProc2)現在是SomeProc1部分(在結束它)。每次運行SomeProc1時,它將丟棄SomeProc2


您還可以檢查做了數據庫更新腳本,尋找那些被丟棄的PROC的定義,並期待它上面看看有什麼代碼它成爲的一部分。


您也應該檢查你的SQL Agent作業,以確保沒有具有嵌入DROP步:

SELECT * 
FROM msdb.dbo.sysjobsteps 
WHERE [command] LIKE N'%DROP_%PROC%'; 
+0

您的SELECT沒有返回任何行。我有一個觸發器可以捕獲所有執行的DDL,並且它只有這個由SA – Mucida

+0

執行的奇怪DROP @Mucida你是否在數據庫中運行了SELECT,而proc從此消失?您還可以檢查執行數據庫更新的腳本,查找正在刪除的proc的定義,然後查看它的上方以查看它成爲其中的代碼。此外,空格可能會影響搜索結果,因此我會用新的搜索字符串更新我的答案。 –

+0

是的,我做到了。最緊張的是,在我們重新創建程序後,客戶可以正常使用系統,但整天使用相同的過程後,此過程再次被「隨機」下降。這就是爲什麼我猜C#異常是這樣做的 – Mucida

0

我建議把一個DDL觸發器DROP_PROCEDURE

然後你就可以防止跌落,除非系統管理員做的。或者你可以記錄它何時被丟棄,以及誰可以研究發生了什麼。