У меня есть набор задач обслуживания в нескольких базах данных, которые запускаются основной хранимой процедурой.Главная хранимая процедура запускается с помощью sp_procoption для запуска при запуске mssql.Затем в определенный день и время запускаются дочерние процедуры во всех моих базах данных.
Мне нужно обновить этот главный сценарий.
Чтобы очистить процедуру обновления и не требовать остановки иперезапуская sql (чтобы убедиться, что запущен только один экземпляр главной процедуры), я хотел бы иметь возможность остановить хранимую процедуру, а затем перезапустить ее в конце сценария обновления.Перезапуск не является проблемой, но кто-нибудь знает способ остановить процедуру из сценария обновления?
Вот сценарий для моего основного процесса планирования:
USE master
GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'weekly_maintenance_task')
DROP PROCEDURE weekly_maintenance_task
GO
CREATE PROCEDURE [dbo].[weekly_maintenance_task]
AS
BEGIN
SET NOCOUNT ON
DECLARE @timeToRun nvarchar(50)
SET @timeToRun = '02:30:00'
DECLARE @dayToRun nvarchar(10)
SET @dayToRun = 'SUNDAY'
WHILE 1 = 1
BEGIN
WAITFOR time @timeToRun
BEGIN
DECLARE @dayOfWeek NVARCHAR(10)
SELECT @dayOfWeek = CASE DATEPART(weekday, GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END
IF (@dayOfWeek = @dayToRun)
BEGIN
EXECUTE sp_msforeachdb 'USE ?
IF DB_NAME() NOT IN (''master'', ''msdb'',''tempdb'',''model'')
IF EXISTS (select * from sys.procedures where name=''database_maintenance_weekly'')
EXECUTE database_maintenance_weekly'
END
END
END
END
GO
sp_procoption @ProcName = 'weekly_maintenance_task',
@OptionName = 'startup',
@OptionValue = 'on'
GO