Инфраструктура типа данных Множество
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) (Новая страница: « __NOTOC__ Category:Руководство разработчика Category:Учебный курс Category:База данных») |
SYSDBA (обсуждение | вклад) |
||
| Строка 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