Инфраструктура типа данных Множество
Материал из 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