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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
 +
При создании типа данных '''Множество''' в базе создается домен строкового типа длиной в 200 символов:
  
 +
<syntaxhighlight lang="SQL">
 +
CREATE DOMAIN USR$TEST_SET AS
 +
  VARCHAR(200) CHARACTER SET WIN1251
 +
  COLLATE PXW_CYRL
 +
</syntaxhighlight>
 +
 +
Информация о справочнике с элементами множества, условии отбора и поле для отображения сохраняется в таблице [[AT_FIELDS]], в колонках SETTABLE, SETCONDITION и SETLISTFIELD соответственно.
 +
 +
При добавлении в некоторую таблицу поля типа множества происходит следующее:
 +
 +
1. Создается кросс-таблица для хранения связей между записью и элементами множества:
 +
 +
<syntaxhighlight lang="SQL">
 +
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;
 +
</syntaxhighlight>
 +
 +
Имя таблицы формируется из префикса USR$CROSS, значения генератора [[GD G TRIGGERCROSS]] и идентификатора базы данных.
 +
 +
Если выбран тип добавляемого поля "С текстовым представлением", то:
 +
 +
2. В таблицу добавляется текстовая колонка:
 +
 +
<syntaxhighlight lang="SQL">
 +
  ...
 +
  USR$TEST_SET  USR$TEST_SET
 +
  ...
 +
</syntaxhighlight>
 +
 +
3. Для поддержания ее содержимого в актуальном состоянии создается триггер:
 +
 +
<syntaxhighlight lang="SQL">
 +
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
 +
</syntaxhighlight>
  
 
__NOTOC__
 
__NOTOC__

Версия 19:17, 28 мая 2012

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

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