Блокировка изменения подразделения
После ввода структуры подразделений организации (Исследователь - Справочники - Клиенты - Организации - Производственные подразделения) может понадобиться заблокировать любые изменения (добавление, редактирование, удаление). Установить блокировку можно с помощью триггера и исключения. Так как подразделения хранятся в той же таблице GD_CONTACT, где и сама организация, и являются ее вложенными уровнями, то для проверки можно использовать границы интервала организации.
Идентификатор организации можно посмотреть в диалоговом окне редактирования. Запомним его.
Зайдем в Редактор SQL и выполним команду:
CREATE EXCEPTION gd_e_cannot_del_depart 'Изменение подразделений заблокировано в триггере!'
Затем наберем и выполним текст триггера:
CREATE TRIGGER gd_aiud_contact_block FOR gd_contact ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 32000 AS DECLARE VARIABLE LB INTEGER; DECLARE VARIABLE RB INTEGER; BEGIN SELECT lb, rb FROM gd_contact WHERE id = <подставьте сюда ИД организации> INTO :LB, :RB; IF ((NEW.lb >= :LB) AND (NEW.rb <= :RB)) THEN BEGIN EXCEPTION gd_e_cannot_del_depart; END END
Остается проверить блокировку в действии.
Если изменения под учетной записью Administrator блокировать не следует, то добавим проверку в триггер:
CREATE TRIGGER gd_aiud_contact_block FOR gd_contact
ACTIVE
AFTER INSERT OR UPDATE OR DELETE
POSITION 32000
AS
DECLARE VARIABLE LB INTEGER;
DECLARE VARIABLE RB INTEGER;
BEGIN
IF (CURRENT_USER <> 'SYSDBA') THEN
BEGIN
SELECT lb, rb FROM gd_contact WHERE id = <подставьте сюда ИД организации>
INTO :LB, :RB;
IF ((NEW.lb >= :LB) AND (NEW.rb <= :RB)) THEN
BEGIN
EXCEPTION gd_e_cannot_del_depart;
END
END
END
Здесь мы использовали известный нам факт, что учетная запись Administrator всегда соответствует учетной записи SYSDBA сервера Firebird.