28 июл. 2017 г.

DATABASE TRIGGERS в Гедымине

Буквально на днях появится возможность создавать в Гедымине DATABASE TRIGGERS. Такие триггеры могут быть назначены на следующие события:
  • CONNECT
  • DISCONNECT 
  • TRANSACTION START
  • TRANSACTION COMMIT 
  • TRANSACTION ROLLBACK
Один из возможных сценариев использования. Представим программу гостиничного бронирования с которой одновременно работают несколько операторов. Бронирование происходит в диалоговом окне, где выбирается номер, период, условия оплаты, дополнительные пожелания. Здесь же вводятся паспортные данные гостей.

Окно работает на своей транзакции, которая по итогу или комитится -- кнопка Ок, или отменяется.

Периоды бронирования заносятся в отдельную таблицу (назовем её BOOKINGS). Здесь хранятся начало, окончание, ссылка на номер и ссылка на клиента. Перед добавлением записи происходит проверка не занят ли уже данный интервал.

В редких случаях возможна ситуация, когда два оператора одновременно распределят один и тот же номер на пересекающиеся интервалы. Так как в момент проверки транзакция не увидит запись, добавленную в BOOKINGS другой, еще не подтвержденной, транзакцией.

В такой ситуации на помощь приходит триггер на комит транзакции. Сначала, триггером на добавление/изменений записей в таблице бронирования мы выставим флаг о необходимости проверки при комите текущей транзакции:

CREATE OR ALTER TRIGGER after_ins_update
  FOR bookings
  ACTIVE
  AFTER INSERT OR UPDATE
  POSITION 32000
AS BEGIN
  RDB$SET_CONTEXT('user_transaction', 'check_tr', 1);
END

Затем, если флаг выставлен, сделаем проверку корректности данных:

CREATE OR ALTER TRIGGER transaction_check
  ACTIVE
  ON TRANSACTION COMMIT
  POSITION 32000
AS BEGIN
  IF (RDB$GET_CONTEXT('user_transaction', 'check_tr') = 1) THEN
  BEGIN
     --   проверяем не пересекаются ли интервалы
     --   если пересекаются, то вызываем EXCEPTION
  END
END

В тексте исключения можно подробно указать пользователю с каким именно бронированием возник конфликт.

1 комментарий:

Stanislau комментирует...

В фронте общепита тоже будет полезным на открытие нового столика.

Отправить комментарий