如何防止SQL存储过程在存储过程运行时更改?

时间:2016-02-17 16:30:48

标签: sql sql-server sql-server-2008 stored-procedures ssms

我们有一个每小时运行一次的存储过程,需要大量修改。有一个问题,有人会在存储过程运行时编辑它,并导致存储过程中断和结束。当有人试图在存储过程运行时编辑存储过程而不是中断执行时,我正在寻找弹出错误。

它是一个每小时运行的SQL Server代理程序作业,我得到"对象的定义' stored_procedure'自编译以来已发生变化。"

我可以添加一些程序吗?设置?

2 个答案:

答案 0 :(得分:1)

我认为您可以在数据库级别使用触发器以防止更改,并在对象内部对运行的存储过程应用验证,如下所示:

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

通过这种方式可以防止存储过程在执行过程中被更改,如果没有执行,则会像往常一样反映更改。希望这有帮助。

答案 1 :(得分:0)

你应该做一些研究和测试,并确认是这种情况。在执行时更改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

QUERY2

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在运行时被缓存并存储在内存中。改变应该没有影响。