ПРИМЕЧАНИЕ. Вы не можете использовать ограничения ссылочной целостности данных в домене.
. ! .
Преимущества инкапсуляции определения данных очевидны. Для простого, но общего примера предположим, что вы проектируете обращения к множеству малых таблиц, где вы собираетесь хранить текстовые описания пронумерованных множеств - таблицы "типов" - типы счетов, типы продуктов, типы пожертвований и т.д. Вы принимаете решение, что каждый элемент каждого из этих множеств будет иметь ключ, состоящий из трех символов в верхнем регистре, который указывает на символьное описание или поле заголовка, имеющее максимум 25 символов.
Все это требует создания двух доменов.
* Домен для указателя будет CHAR(3) с двумя дополнительными атрибутами: ограничение NOT NULL, поскольку вы собираетесь его использовать в качестве первичного ключа и ключа поиска, и ограничение CHECK для проверки наличия прописных букв. Например:
CREATE DOMAIN Туре_Кеу AS CHAR(3) NOT NULL
CHECK(VALUE = UPPER(VALUE));
* Домен описания будет VARCHAR(25). Вы хотите запретить для него пустые значения, поскольку таблицы, в которых вы собираетесь его использовать, являются управляющими:
CREATE DOMAIN Type_Description AS VARCHAR(25) NOT NULL;
Когда вы создадите эти домены, все ваши взаимосвязанные таблицы могут иметь похожие определения, а все таблицы, хранящие ключи, ссылающиеся на такие таблицы, будут использовать соответствующий домен для столбцов ключа.
Создание домена
Синтаксис языка определения данных (DDL) для создания домена:
CREATE DOMAIN домен [AS] <тип-данных>
[DEFAULT литерам |NULL |USER]
[NOT NULL] [CHECK (<условие-поиска-домена>)]
[CHARSET набор-символов| NONE]
[COLLATE порядок-сортировки];
Идентификатор домена
При создании в базе данных домена вы должны задать идентификатор домена, который является глобально уникальным в базе данных. Разработчики часто используют префикс или суффикс в идентификаторах доменов для улучшения документирования. Например:
CREATE DOMAIN D_TYPE_IDENTIFIER...
CREATE DOMAIN DESCRIPTION_D. . .
Тип данных домена
Tun данных является единственным обязательным атрибутом, который должен быть установлен для домена - все другие атрибуты необязательны. Он задает тип данных SQL, который будет применен для столбца, определенного с использованием этого домена. Может быть применен любой тип данных Firebird. Нельзя использовать домен как тип данных для другого домена.
Следующий оператор создает домен, определяющий массив символьного типа:
CREATE DOMAIN DEPTARRAY AS CHAR(31) [4:5];
Следующий оператор создает домен BLOB текстового подтипа, которому назначен набор символов, перекрывающий набор символов базы данных по умолчанию. Фактически он создает специализированный тип примечания для хранения текста на японском языке:
CREATE DOMAIN DESCRIPT_JP AS BLOB SUB_TYPE TEXT
CHARACTER SET SJIS;
Атрибут DEFAULT
Домен может определять значение по умолчанию, которое сервер будет использовать при добавлении новой строки, если оператор INSERT не содержит этот столбец в списке столбцов. Значения по умолчанию могут сэкономить время и избавить от ошибок в процессе ввода данных. Например, для столбца DATE возможным значением по умолчанию может быть текущая дата, а для столбца userName (имя пользователя) можно указать контекстную переменную CURRENT_USER.
Значение по умолчанию может быть:
* константой. Значением по умолчанию является заданная пользователем строка, числовое значение или значение даты - часто используется для помещения "нулевого значения" в столбец, куда не могут помещаться пустые значения (NULL);
* CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME или предварительно определенный литерал даты Firebird (см. главу 10);
* USER, CURRENT_USER или CURRENT_ROLE (если применяются роли);
* CURRENT_CONNECTION или CURRENT_TRANSACTION.
! ! !
ПРИМЕЧАНИЕ. Возможно указание в качестве значения по умолчанию NULL. Хотя это излишне, поскольку столбцы, допускающие пустое значение, в любом случае инициализируются по умолчанию значением NULL. Более того, явное указание значения по умолчанию NULL может привести к конфликтам, если столбец, использующий домен, должен быть определен с ограничением NOT NULL (CM. разд. "Атрибут NOT NULL" далее в этой главе).
. ! .
Следующий оператор создает домен, который должен иметь положительное значение больше 1000. Если в операторе INSERT не указан столбец, созданный на основе этого домена, столбцу будет назначено значение по умолчанию 9999:
CREATE DOMAIN CUSTNO
AS INTEGER
DEFAULT 9999
CHECK(VALUE > 1000);
Если ваша операционная система поддерживает использование многобайтовых символов в именах пользователей или если вы используете многобайтовый набор символов при определении роли, то каждый столбец, в котором должно сохраняться такое значение по умолчанию, должен быть определен с использованием подходящего набора символов.