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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
Строка 11: Строка 11:
 
При добавлении в некоторую таблицу поля типа множества происходит следующее:
 
При добавлении в некоторую таблицу поля типа множества происходит следующее:
  
1. Создается кросс-таблица для хранения связей между записью и элементами множества:
+
====1. Создается кросс-таблица для хранения связей между записью и элементами множества:====
  
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
Строка 38: Строка 38:
 
Если выбран тип добавляемого поля "С текстовым представлением", то:  
 
Если выбран тип добавляемого поля "С текстовым представлением", то:  
  
2. В таблицу добавляется текстовая колонка:
+
====2. В таблицу добавляется текстовая колонка:====
  
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
Строка 46: Строка 46:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
3. Для поддержания ее содержимого в актуальном состоянии создается триггер:
+
====3. Для поддержания ее содержимого в актуальном состоянии создается триггер:====
  
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">

Текущая версия на 17:01, 1 августа 2013

При создании типа данных Множество в базе создается домен строкового типа длиной в 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
Персональные инструменты
Пространства имён

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