Обмен данными между двумя системами на уровне БД выполняется с помощью запуска хранимых процедур SQL. Запуск хранимых процедур выполняется либо по триггеру (при наступлении определенного события), либо по расписанию. При работе по расписанию администраторам важно контролировать, когда состоялся последний запуск хранимой процедуры и сколько записей было обработано. Это поможет им выявить ошибки — если запуск процедуры по каким-то причинам не произошел или если количество записей, которое было обработано, существенно отличается от среднестатистического.
Для логирования можно использовать специальную таблицу – журнал (лог) записей о событиях обмена, а также хранимую процедуру, которая будет формировать эти записи. По каждому вызову процедуры обмена записываются: название и ID процедуры обмена, время начала и окончания выполнения, количество добавленных и обновленных записей.
Таблица с журналом обмена данными.
ALTER PROCEDURE [dbo].[cm_int_spStatEvent]
@sp VARCHAR(100),
@event VARCHAR(10),
@insCount INT = NULL,
@updCount INT = NULL,
@extStat VARCHAR(MAX) = NULL,
@result VARCHAR(MAX) = NULL,
@setChagesDate INT = NULL, -- 0 — NOT SET, 1 — SET, NULL — AUTO
@printStat INT = 0
AS
BEGIN
SET NOCOUNT ON;
IF (SELECT COUNT(*) FROM cm_int_procedures WHERE [proc] = @sp) = 0 BEGIN
INSERT INTO cm_int_procedures ([proc]) VALUES (@sp);
END;
-- START
IF @event = 'start' BEGIN
UPDATE cm_int_procedures SET last_started = GETDATE() WHERE [proc] = @sp;
END;
-- FINISH
IF @event = 'finish' BEGIN
DECLARE @stat VARCHAR(100) = '', @changesDate DATETIME;
IF @insCount IS NOT NULL BEGIN
SET @stat+= 'inserted: ' + CAST(@insCount AS VARCHAR(10)) + '; ';
END;
IF @updCount IS NOT NULL BEGIN
SET @stat+= 'updated: ' + CAST(@updCount AS VARCHAR(10)) + '; ';
END;
IF (@setChagesDate = 1 OR (@setChagesDate IS NULL AND @insCount IS NOT NULL AND @updCount IS NOT NULL AND @insCount + @updCount > 0)) BEGIN
SET @changesDate = GETDATE();
END;
UPDATE cm_int_procedures SET last_finished = GETDATE(), last_result = COALESCE(@result, @stat), changes_date = COALESCE(@changesDate, changes_Date) WHERE [proc] = @sp;
END;
-- PRINT
IF @printStat = 1 BEGIN
SELECT COALESCE(@result, @stat);
END;
END
|
В каждой процедуре обмена запись в журнал вызывается дважды – в начале и в конце.
ALTER PROCEDURE [dbo].[cm_int_syncCat_city]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@procName VARCHAR(50),
@insertedCount INT = 0,
@updatedCount INT = 0;
SET @procName = OBJECT_NAME(@@PROCID);
EXEC cm_int_spStatEvent @sp = @procName, @event = 'start';
...
...
EXEC cm_int_spStatEvent @sp = @procName, @event = 'finish', @insCount = @insertedCount, @updCount = @updatedCount, @printStat = 1;
END;
|
Данные из таблицы — журнала обмена — могут выводиться на портал администратора, например, в портальном блоке "Таблица".