簡體   English   中英

如何在存儲過程運行時防止SQL存儲過程更改?

[英]How to prevent SQL Stored Procedure Alters while the stored procedure is running?

我們有一個存儲過程,每小時運行一次,需要大量修改。 存在一個問題,當存儲的proc運行時,有人會對其進行編輯,這將導致存儲的proc中斷並結束。 我正在尋找有人在運行時嘗試編輯存儲過程而不是中斷執行時彈出的錯誤。

這是一個每小時運行一次的sql服務器代理作業,我收到“對象'stored_procedure'的定義自編譯以來已更改。”

我可以添加一些程序嗎? 設置嗎?

我認為您可以在數據庫級別使用觸發器,以防止更改,並且在對象內對正在運行的存儲過程應用驗證,如下所示:

USE [YourDatabase]
GO


ALTER TRIGGER [DDLTrigger_Sample]
    ON DATABASE
    FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
BEGIN    
    IF EXISTS (SELECT TOP 1 1
                    FROM sys.dm_exec_requests req
                    CROSS APPLY sys.dm_exec_query_plan(req.plan_handle) sqlplan WHERE sqlplan.objectid = OBJECT_ID(N'GetFinanceInformation'))
    BEGIN
        PRINT 'GetFinanceInformation is running and cannot be changed'
        ROLLBACK        
    END 
END

這樣,您可以防止在執行過程中更改存儲過程,如果不執行該更改,則更改將照常反映。 希望這可以幫助。

您應該進行一些研究和測試,並確認是這種情況。 在執行過程中更改SProc不會影響運行。

打開兩個SSMS窗口並首先運行查詢1,然后切換到窗口2並運行該查詢。

查詢1

CREATE PROCEDURE sp_altertest
AS 
BEGIN 

SELECT 'This is a test'

WAITFOR DELAY '00:00:10'
END
GO 

EXEC sp_altertest

查詢2

alter procedure sp_altertest AS

BEGIN 

SELECT 'This is a test'

WAITFOR DELAY '00:00:06'
END
GO 
Exec sp_altertest

查詢1應該繼續運行並具有10秒的執行時間,而查詢2將以6秒的運行時間運行。 SProc在運行時被緩存並存儲在內存中。 更改應該沒有影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM