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

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

2 комментария:

shareef shaik комментирует...

http://ssapptricks.com/slader/
Valuable information! Looking forward to seeing your notes posted. The information you have posted is very useful. Keep going on, good stuff. Thank you for this valuable information. I have enjoyed reading many of the articles and posts contained on the website, keep up the good work and hope to read some more interesting content in the future.

Станислав Шляхтич комментирует...

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

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