Можно ли использовать аргументы с событиями firebird: POST_EVENT 'имя-события' + строковые аргументы? - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть триггер, который обнаруживает изменение в поле PHONE_EXT и отправляет событие. Я хотел бы опубликовать Phone_ID с событием, чтобы использовать этот идентификатор в клиенте. Это возможно? Как?

CREATE TRIGGER tr2 FOR employee
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
    IF (new.PHONE_EXT <> old.PHONE_EXT) THEN
          POST_EVENT 'phone_ext_changed'; <-- I would like to pass a string parameter with record ID
END

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

AFAIK, вы не можете передавать параметры, но вы можете получить то, что вы хотите с одной из этих идей:

  • Если в вашем клиенте вас интересуют события, связанные с конкретными записями, вы можете добавить идентификатор изменяющейся записи и опубликовать это событие. Клиенты регистрируют события, в которых заинтересованы, используя конкретные идентификаторы интересов. Смотрите пример 1.
  • если ваш интерфейс заинтересован во всех изменениях, но вы хотите знать, какие именно записи изменились, вы можете «пометить» записи как «недавно измененные» (используя другое поле в той же записи или таблицу подробностей пример). После уведомления клиента и действия он отменяет или снимает флажок. Этот подход может быть реализован, например, с использованием вспомогательных таблиц для отслеживания пропущенных записей от конкретных клиентов, это зависит от ваших потребностей.

Пример 1

begin
  if (new.phone_ext <> old.phone_ext) then
    post_event 'phone_ext_changed_'||new.ID;
end

Пример 2

begin
  if (new.phone_ext <> old.phone_ext) then
  begin
    new.recent_ext_change = 1;
    /* or maybe */
    new.last_ext_change = cast('now' as DateTime);
    /* or maybe */
    insert into changed_phone_ext values (gen_id(some_generator, 1), New.ID, 'now');
    /* finally, post the event */
    post_event 'phone_ext_changed_';
  end
end

Я успешно использую оба в разных приложениях / ситуациях.

0 голосов
/ 13 июня 2018

Это невозможно. Событие является только именем, если вы добавляете идентификаторы или другие квалификаторы, оно просто становится другим событием, потому что оно имеет другое имя. При подписке на события вы можете подписаться только по имени, вы не можете использовать подстановочные знаки, и невозможно включить параметры.

События предназначены для простого и дешевого уведомления, и Firebird может даже объединить несколько «сообщений» одного и того же события в одно уведомление клиента, поэтому параметры или значения не поддерживаются.

Основная идея заключается в том, что клиент подписывается на события, а затем определяет, что изменилось и на что он должен реагировать. Вы можете «помочь» клиенту, например, заполнив таблицу поддержки, которую дешево запрашивать.

Также рассмотрите возможность прочтения статьи «Сила событий Firebird» , она немного устарела, но во многом она применима, поскольку события Firebird не сильно изменились.

0 голосов
/ 15 ноября 2016

Вы можете использовать его следующим образом:

  1. Установите контекстную переменную в триггере и поместите в нее нужную информацию.

Пример:

Create trigger evento_ai0 for evento
active after insert position 0
AS
BEGIN
 Post_Event 'Evento_inserido';

«Создание переменной контекста»

rdb$set_context('USER_SESSION', 'REGISTRO' , 'Registro inserido: '||new.eve_id);
END

Для захвата сохраненной информации используйте:

Select rdb$get_context('USER_SESSION', 'REGISTRO') from rdb$database;

...