CREATE TABLE LIBRARY_USER (
USER_ID INTEGER NOT NULL.
. . . <���другие столбцы>,
PHONE_NO TEL_NUMBER,
CONSTRAINT CHK_TELNUM_UPPER
CHECK (PHONE_NO = UPPER(PHONE_NO))
);
Теперь у нас есть дополнительная проверка CHECK для этого столбца. Следующий оператор:
INSERT INTO LIBRARY_USER VALUES (USER_ID, PHONE_NO)
VALUES (99, '(09) 43889 wish');
будет ошибочным, потому что дополнительное ограничение CHECK требует, чтобы телефонный номер был '(09) 43889 wish'.
Домен не может быть использован:
* в функции CAST (<���имя_домена> AS <���другой_тип>);
* вместо явного типа данных при определении входных и выходных аргументов хранимых процедур;
* при объявлении типа данных локальной переменной в триггере или хранимой процедуре;
* при определении типа данных элементов массива. При этом сам домен может быть массивом.
Объявление домена BOOLEAN
Firebird не поддерживает тип данных BOOLEAN. Домены в стиле BOOLEAN являются идеалом, потому что вы можете объявлять атрибуты, которые будут постоянными для всех таблиц. Рекомендуется использование минимальных типов данных: CHAR для переключателя T[rue]/F[aise] или Y[es]/N[о] или SMALLINT для пары 1/0. Следующие примеры предлагают способы, которыми вы можете реализовать ваши типы BOOLEAN.
Пример 13.1. Двухфазный переключатель со значением по умолчанию 'F' (False)
CREATE DOMAIN D_BOOLEAN AS CHAR
DEFAULT 'F' NOT NULL
CHECK(VALUE IN ('T', 'F'));
Пример 13.2. Трехфазный переключатель, допускающий значение UNKNOWN (т. е. NULL):
CREATE DOMAIN D_LOGICAL AS SMALLINT
CHECK(VALUE IS NULL OR VALUE IN (1,0));
Пример 13.3. Трехфазный переключатель, представляющий UNKNOWN как значение:
CREATE DOMAIN D_GENDER AS CHAR(4)
DEFAULT 'N/K' NOT NULL
CHECK (VALUE IN ('FEM', 'MASC', 'N/K'));
! ! !
ВНИМАНИЕ! He используйте BOOLEAN, UNKNOWN, TRUE или FALSE В качестве имен для булевых доменов. В Firebird это зарезервированные слова. Истинно логические типы планируются в Firebird 2 и могут появиться в промежуточных релизах между 1.5 и 2.
. ! .
Изменение определения домена
Оператор языка определения данных ALTER DOMAIN может быть использован для изменения любого аспекта существующего домена за исключением установки NOT NULL. Изменения, сделанные вами в определении домена, воздействуют на все определения столбцов, основанных на этом домене, если только соответствующие атрибуты не были переопределены на уровне таблицы.
Домен может быть изменен его создателем, пользователем SYSDBA или (в Linux/UNIX) любым пользователем с привилегией root операционной системы.
Используя ALTER DOMAIN, вы можете:
* переименовать домен;
* изменить тип данных;
* удалить существующее значение по умолчанию;
* установить новое значение по умолчанию;
* удалить существующее ограничение CHECK;
* добавить новое ограничение CHECK.
! ! !
ПРИМЕЧАНИЕ. Существует только один путь "изменить" установку NOT NULL для домена - это удалить домен и заново создать его с желаемой комбинацией характеристик.
. ! .
Вот синтаксис оператора:
ALTER DOMAIN { имя | старое-имя ТО новое-имя } {
[SET DEFAULT {литерал | NULL | USER | etc.}]
| [DROP DEFAULT]
| [ADD [CONSTRAINT] CHECK (<���условия-соответствия>)]
| [DROP CONSTRAINT]
| TYPE тип-данных
};
Этот оператор устанавливает новое значение по умолчанию для домена BOOK_GROUP:
ALTER DOMAIN BOOK_GROUP SET DEFAULT -1;
В следующем операторе имя домена BOOK_GROUP заменяется на PUBL_GROUP:
ALTER DOMAIN BOOK_GROUP TO PUBL_GROUP;
Ограничения на изменение типов данных
Предложение TYPE в ALTER DOMAIN позволяет заменить тип данных на другой разрешенный тип данных. Разрешенные типы преобразований см. на рис. 8.1.
Недопустим никакой тип преобразования, который может привести к потере данных. Например, количество символов в домене не может быть сделано меньше размера наибольшего значения в любом столбце, использующим этот домен [31] При изменении типов домена учитывайте, что в хранимых данных могут быть данные, которые не пройдут преобразование из одного типа в другой. Например, VARCHAR В INTEGER сконвертируется, только если VARCHAR будет содержать цифры и числа, допустимые для INTEGER - Прим. науч. ред.
.
Преобразование числового типа данных в символьный тип требует минимальной длины для символьного типа, как указано в табл. 8.3.
Следующий оператор меняет тип данных домена BOOK_TITLE С CHAR(80) на VARCHAR(100) :
ALTER DOMAIN BOOK_TITLE TYPE VARCHAR(100);
Оператор DROP DOMAIN удаляет из базы данных существующее описание домена при условии, что домен не используется в каком-либо описании столбца базы данных.
Чтобы не получить исключений, применяйте ALTER TABLE для удаления всех столбцов, использующих домен, а затем выполняйте DROP DOMAIN. Лучший способ сделать это за одно задание - использовать скрипт DDL. См. разд. "Скрипты схемы" в следующей главе.
Читать дальше