"D:\Replicator_1_beta\Client\TEMPLATE.GDB" Previous topic Chapter index Next topic

BI_MASTER

 

 

Descriptions

There is no desription for trigger BI_MASTER

 

Definition


CREATE TRIGGER BI_MASTER FOR MASTER ACTIVE
BEFORE INSERT POSITION 32767
AS
DECLARE VARIABLE REPL_COUNT  INTEGER;
DECLARE VARIABLE CURR_GEN    INTEGER;
DECLARE VARIABLE LOCAL_ID    INTEGER;
DECLARE VARIABLE CURR_DB_ID  INTEGER;
BEGIN
  /*Описание.
  Если не в режиме репликации: генерирует глобальный идентификатор записи(GID),
     устанавливает собственное поколение записи (LOG_OWN_GEN).
  Всегда добавляет запись в соответствующую таблицу LOG_XXXX,
     поколение вставки LOG_INS_GEN и изменения/удаления LOG_UPD_GEN этой записи установлены в NULL
     (поколение записи с÷итается неустановленным, поколение установит процедура SET_NEW_GEN).
     Вызывается после всех остальных (возможных) триггеров
  */
  
  /*Полу÷ить кол-во серверов с которыми происходит репликация (в текущей транзакции)*/
  SELECT COUNT( DB_ID ) FROM CURR_SERV INTO :REPL_COUNT;
  /*Если REPL_COUNT = 0, зна÷ит транзакция не в состоянии репликации.
  Генерируется GID (глобальный идентификатор записи) и  LOG_OWN_GEN (собственное поколение записи)
  Если REPL_COUNT = 1, зна÷ит транзакция в состоянии репликации. Предполагается, ÷то вставку производит процедура репликации. GID и LOG_OWN_GEN не генерируются.
  Если REPL_COUNT > 1, зна÷ит произошла внутрення ошибка (напр. таблица CURR_SERV не была о÷ищена после предыдущей репликации)*/
  IF( REPL_COUNT = 0 )THEN
    BEGIN
      SELECT DB_ID FROM CURR_DB_ID INTO :CURR_DB_ID;/*Полу÷ить ID текущей БД*/
      SELECT GEN FROM CURR_GEN INTO :CURR_GEN;/*Полу÷ить текущее зна÷ение с÷¸т÷ика поколений*/
      /**/
      NEW.LOG_OWN_GEN = CURR_GEN + 1;/*LOG_OWN_GEN заносится следующее зна÷ение с÷¸т÷ика поколений(которое будет в LOG_INS_GEN)*/
      LOCAL_ID = GEN_ID( GEN_MASTER, 1 );
      IF( LOCAL_ID<0 OR LOCAL_ID>4294967295 )THEN EXCEPTION E_GENERATOR_RANGE_ERROR;
      NEW.GID = CURR_DB_ID*4294967296 + LOCAL_ID;/*4 старших байта - ID БД, 4 младших - локальный ID записи*/
    END
  ELSE
    IF( REPL_COUNT <> 1 )THEN EXCEPTION EINTERNAL_MULTIPLE_REPL;/*ASSERT(DEBUG)*/
  /**/
  EXECUTE PROCEDURE CHECK_DB_ID_REFERENCE( NEW.DB_ID );/*Проверить ссыло÷ную целостность. DB_ID должен быть в таблице DB_PROFILE*/
  /*Добавить запись в таблицу регистрации (перед вставкой записи в таблицу данных). LOG_INS_GEN и LOG_UPD_GEN установлены в NULL)*/
  INSERT
    INTO LOG_MASTER( LOG_GID )
    VALUES ( NEW.GID );
END

    This file was generated with EMS InterBase/FireBird Manager (www.ibmanager.com) at 11/13/2006 10:51 PM Previous topic Chapter index Next topic

 

Хостинг от uCoz