Инфраструктура типа данных Множество

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

При создании типа данных Множество в базе создается домен строкового типа длиной в 200 символов:

CREATE DOMAIN USR$TEST_SET AS
  VARCHAR(200) CHARACTER SET WIN1251
  COLLATE PXW_CYRL

Информация о справочнике с элементами множества, условии отбора и поле для отображения сохраняется в таблице AT_FIELDS, в колонках SETTABLE, SETCONDITION и SETLISTFIELD соответственно.

При добавлении в некоторую таблицу поля типа множества происходит следующее:

1. Создается кросс-таблица для хранения связей между записью и элементами множества:

CREATE TABLE USR$CROSS18_1891093774 (
  USR$TESTKEY        DINTKEY NOT NULL,
  USR$GD_CONTACTKEY  DINTKEY NOT NULL
);
 
ALTER TABLE USR$CROSS18_1891093774 
  ADD CONSTRAINT PK_USR$CROSS18_1891093774_11 
  PRIMARY KEY (USR$TESTKEY, USR$GD_CONTACTKEY);
 
ALTER TABLE USR$CROSS18_1891093774 
  ADD CONSTRAINT FK_USR$CROSS18_1891093774_12 
  FOREIGN KEY (USR$TESTKEY) REFERENCES USR$TEST (ID) 
  ON DELETE CASCADE ON UPDATE CASCADE;
 
ALTER TABLE USR$CROSS18_1891093774 
  ADD CONSTRAINT FK_USR$CROSS18_1891093774_13 
  FOREIGN KEY (USR$GD_CONTACTKEY) REFERENCES GD_CONTACT (ID) 
  ON UPDATE CASCADE;

Имя таблицы формируется из префикса USR$CROSS, значения генератора GD G TRIGGERCROSS и идентификатора базы данных.

Если выбран тип добавляемого поля "С текстовым представлением", то:

2. В таблицу добавляется текстовая колонка:

  ...
  USR$TEST_SET  USR$TEST_SET 
  ...

3. Для поддержания ее содержимого в актуальном состоянии создается триггер:

CREATE OR ALTER TRIGGER usr$bi_usr$cross18_1891093774 FOR usr$test
  active 
  BEFORE UPDATE 
  POSITION 18
AS 
  DECLARE VARIABLE attr VARCHAR(8192); 
  DECLARE VARIABLE text VARCHAR(8192) = ''; 
BEGIN 
  FOR 
    SELECT L.NAME 
      FROM 
        USR$CROSS18_1891093774 C JOIN GD_CONTACT L ON C.USR$GD_CONTACTKEY = L.ID 
      WHERE C.USR$TESTKEY = NEW.ID AND L.NAME > '' 
      INTO :attr 
  DO 
  BEGIN 
    IF (CHARACTER_LENGTH(:text) > 200) THEN 
      LEAVE; 
    text = :text || SUBSTRING(:attr FROM 1 FOR 254) || ' '; 
  END 
  NEW.USR$TEST_SET = TRIM(SUBSTRING(:text FROM 1 FOR 200)); 
END
Персональные инструменты
Пространства имён

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