我有一個存儲過程在客戶端使用系統時被刪除,並且他們無法訪問數據庫。所以他們不能手動刪除它正在刪除SQL Server存儲過程
我看到很多人說,它可能是IF EXISTS... DROP PROC
聲明之前缺少的GO
,但是這個程序在我們運行腳本更新數據庫的時刻並沒有消失,它正在在用戶使用系統時刪除。在C#代碼中沒有DROP
。所以我不知道發生了什麼。 有什麼可以放棄它?
我有一個存儲過程在客戶端使用系統時被刪除,並且他們無法訪問數據庫。所以他們不能手動刪除它正在刪除SQL Server存儲過程
我看到很多人說,它可能是IF EXISTS... DROP PROC
聲明之前缺少的GO
,但是這個程序在我們運行腳本更新數據庫的時刻並沒有消失,它正在在用戶使用系統時刪除。在C#代碼中沒有DROP
。所以我不知道發生了什麼。 有什麼可以放棄它?
我想那些說「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.SomeProc1
和IF EXISTS(...SomeProc2)
之間的IF EXISTS(...SomeProc2)
現在是SomeProc1
部分(在結束它)。每次運行SomeProc1
時,它將丟棄SomeProc2
。
您還可以檢查做了數據庫更新腳本,尋找那些被丟棄的PROC的定義,並期待它上面看看有什麼代碼它成爲的一部分。
您也應該檢查你的SQL Agent作業,以確保沒有具有嵌入DROP步:
SELECT *
FROM msdb.dbo.sysjobsteps
WHERE [command] LIKE N'%DROP_%PROC%';
我建議把一個DDL觸發器DROP_PROCEDURE
然後你就可以防止跌落,除非系統管理員做的。或者你可以記錄它何時被丟棄,以及誰可以研究發生了什麼。
你有鏡像或複製設置的任何級別? – Ruskin
不,我不知道。我只能認爲某種類型的C#異常正在這樣做 – Mucida
您應該查詢在SQL服務器上運行的默認跟蹤,以查看誰在刪除它 – sqlhdv