Блокировка изменения подразделения

Материал из GedeminWiki
Перейти к: навигация, поиск

После ввода структуры подразделений организации (Исследователь - Справочники - Клиенты - Организации - Производственные подразделения) может понадобиться заблокировать любые изменения (добавление, редактирование, удаление). Установить блокировку можно с помощью триггера и исключения. Так как подразделения хранятся в той же таблице 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.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты