Как это можно сделать? Я вижу несколько вариантов:
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
Комментариев нет:
Отправить комментарий