Как это можно сделать? Я вижу несколько вариантов:
1. Запускать формирование отчетов сразу же после обновлений необходимой таблицы, к примеру прописав на таблице с логами триггер. Минус, пока не отработает триггер, не начнется следующий этап.
2. Создание user configurable trace event (не знаю как красиво перевести) используя sp_trace_generateevent. Вроде как грамотное решение. Так сказать событийная модель в SQL Server, я, правда, не разбирался со всякими там WMI Provider, WQL и другими страшными словами:) Но возможности которые открываются выглядят заманчиво. Может когда-нибудь разберусь, и буду использовать.
3. Я пока пришел к следующему решению. Создаем на сервере джоб, который стартует в предполагаемое время, ждет окончания обновлений, и делает свою работу (формирует отчеты). Естественно, минусы в том что на сервере вместе с основными обновлениями крутиться что-то еще есть. а) возрастает нагрузка на сервер; б)могут возникнуть блокировки, поэтому нужно следить что именно делается в джобе (как любит говорить один мой знакомый: "Один в #опе, два в уме", в моем случае в джобе идет Select из одной единственной таблицы, которая после обновлений не изменяется на протяжении всего дня, вроде проблем быть не должно).
Ну и в виде кода все это дело может выглядить примерно так:
USE [Temp]
GO
IF EXISTS (SELECT
1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[tbLog]')
AND type in (N'U')
)
BEGIN
DROP TABLE [dbo].[tbLog]
END
CREATE TABLE [dbo].[tbLog](
[Date] [datetime] NULL
) ON [PRIMARY]
-- ------------------------------------------------------------
IF EXISTS ( SELECT
1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[spTestDelay]')
AND type in (N'P', N'PC')
)
BEGIN
DROP PROCEDURE [dbo].[spTestDelay]
END
GO
CREATE PROCEDURE [dbo].[spTestDelay]
AS
BEGIN
DECLARE @Flag bit
SET @Flag = 0
WHILE @Flag = 0
BEGIN
-- waiting for updates
IF EXISTS( SELECT
1
FROM [dbo].[tbLog]
WHERE DATEDIFF(DAY, Date, GETDATE()) = 0
)
BEGIN
-- Run necessary stored procedures
SET @Flag = 1
END
ELSE
BEGIN
WAITFOR DELAY '00:01'
END
END
END
Комментариев нет:
Отправить комментарий