Материал из GedeminWiki
Требования к системе блокировки изменения данных:
- Правила блокировки должны являться бизнес-объектами и храниться в самой базе данных
- Правила блокировки можно передавать с помощью настроек
- Правило можно устанавливать для любой таблицы
- При вычислении правила можно обращаться к:
- Полям таблицы
- Встроенным функциям (например CURRENT_DATE)
- Глобальным переменным
- Правила вычисляются на стороне сервера с помощью триггеров
- В процессе вычисления правил должны быть минимизированы обращения к базе данных
Краткое описание существующего механизма блокировки периода.
Изначально, блокировка периода распространялась на все документы и всех пользователей системы. Позже, была добавлена возможность исключить некоторые группы пользователей из блокировки и, наконец, мы добавили возможность исключать некоторые типы документов. Но, период, а точнее дата, до которой запрещается изменять записи в БД, остается фиксированной константой.
За определение: подпадает конкретный тип документа под блокировку или нет, отвечает процедура gd_p_exclude_block_dt, которая возвращает 1, если переданный идентификатор типа документа не блокируется и 0 в противном случае. Процедура формируется в окне Tgd_dlgOptions при выборе типов документов исключаемых из блокировки. Системными составляющими механизма блокировки периода являются генераторы gd_g_block и gd_g_block_group. Первый хранит дату, до которой документы считаются заблокированными, а второй -- битовую маску групп пользователей, на которых распространяется блокировка. Механизм реализуется с помощью 12-ти триггеров, по три на каждую из четырех таблиц: gd_document, ac_entry, ac_record и inv_movement. Существующий триггер блокировки периода выглядит следующим образом. В случае нарушения условия блокировки вызывается исключение gd_e_block.
Данный механизм имеет следующие ограничения:
- Нельзя устанавливать разные периоды для разных типов документов;
- Нельзя устанавливать разные периоды для разных групп пользователей;
- Дата блокировки задается фиксированной константой.