我们有一个每小时运行一次的存储过程,需要大量修改。有一个问题,有人会在存储过程运行时编辑它,并导致存储过程中断和结束。当有人试图在存储过程运行时编辑存储过程而不是中断执行时,我正在寻找弹出错误。
它是一个每小时运行的SQL Server代理程序作业,我得到"对象的定义' stored_procedure'自编译以来已发生变化。"
我可以添加一些程序吗?设置?
答案 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在运行时被缓存并存储在内存中。改变应该没有影响。