Чтобы создать пользовательский триггер для таблицы, необходимо открыть Microsoft SQL Server Management Studio, подключиться к серверу, выбрать базу данных и открыть раздел Triggers (рис. 7.1). Здесь можно создать новый триггер или изменить существующий.
Рисунок 7.1. Редактирование триггера для таблицы PATIENTS
Триггер, отвечающий за синхронизацию по протоколу HL7, записывает определенные данные в таблицу HL7_EVENTS. Структура таблицы и характеристика содержащихся в ней данных приведены в разделе ТАБЛИЦЫ БАЗЫ ДАННЫХ МОДУЛЯ "ПРОТОКОЛ HL7".
Ниже представлен пример триггера, выполняющегося при изменении пациента, а именно — полей NOM (Фамилия), PRENOM (Имя), PATRONYME (Отчество), NE_LE (Дата рождения), N_OMON (Номер ЭМК) таблицы PATIENTS (Пациенты).
Триггер выполняется только в том случае, когда в параметрах модуля установлен флаг Синхронизация медицинской информации через HL7 протокол, т.е. FM_PARAMS.PRM_VALUE=1 для параметра с именем 'ISCHECKHL7'. Проверка данного параметра
if Exists(select PRM_VALUE from fm_params where PRM_NAME = 'ISCHECKHL7' and PRM_VALUE = '1')
должна выполняться для любого триггера.
При вставке значений в таблицу HL7_EVENTS
insert into HL7_EVENTS (HL7_EVENTS_ID, REC_ID, REC_TYPE, ACTION_TYPE, EXT_CODE, CREATION_DATE)
values (@HL7_EVENTS_ID, @REC_ID, 'P', 'U', @EXT_CODE, GetDate())
значения, прописываемые в поля REC_TYPE и ACTION_TYPE, должны соответствовать коду события, заданному в файле настройки исходящих сообщений (HL7_OUT.xml). Если поле HL7_EVENTS.ACTION_TYPE не пусто, его значение прибавляется к HL7_EVENTS.REC_TYPE со знаком подчеркивания, т.е. код события:
<code>P_U</code>
Поле REC_TYPE можно не использовать.
Пример триггера:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[tU_PATIENTS] on [dbo].[PATIENTS] for UPDATE as
begin
/* синхронизация с HL7 модулем */
/* для синхронизации нужно включить флаг Синхронизация медицинской информации через HL7 протокол в параметрах системы */
if Exists(select PRM_VALUE from fm_params where PRM_NAME = 'ISCHECKHL7' and PRM_VALUE = '1')
begin
if UPDATE(NOM) or UPDATE(PRENOM) or UPDATE(PATRONYME) or UPDATE(NE_LE) or UPDATE(N_OMON)
begin
DECLARE @HL7_EVENTS_ID int
DECLARE @REC_ID int
DECLARE @EXT_CODE varchar(64)
DECLARE HL7 CURSOR FOR
SELECT PATIENTS_ID, N_OMON from inserted
OPEN HL7
FETCH NEXT FROM HL7 INTO @REC_ID, @EXT_CODE
WHILE @@FETCH_STATUS = 0
BEGIN
exec up_get_id 'HL7_EVENTS', 1, @HL7_EVENTS_ID output
insert into HL7_EVENTS (HL7_EVENTS_ID, REC_ID, REC_TYPE, ACTION_TYPE, EXT_CODE, CREATION_DATE)
values (@HL7_EVENTS_ID, @REC_ID, 'P', 'U', @EXT_CODE, GetDate())
FETCH NEXT FROM HL7 INTO @REC_ID, @EXT_CODE
END
CLOSE HL7
DEALLOCATE HL7
end
end
Подобные триггеры на создание, изменение и удаление пациента имеются в каждой базе. По умолчанию они неактивны. Чтобы активировать триггеры, достаточно удалить знаки комментария.