Создание доменов
В SQL понятие "домен" несколько отличается от аналогичного понятия реляционной модели [31:
- • использование доменов не обязательно – столбцы в таблицах могут определяться напрямую через встроенные типы данных;
- • домен в SQL должен определяться в терминах одного из встроенных типов данных;
- • домен в SQL играет роль синтаксического сокращения, позволяющего один раз ввести значение по умолчанию или набор ограничений и использовать их для определения множества столбцов;
- • домены в SQL не ограничивают сравнение – контролируется, чтобы в сравнении участвовали значения одного базового типа (числовые, строковые и т.д.), которые не обязательно должны принадлежать одному домену.
Для создания домена используется оператор CREATE DOMAIN, формат которого приведен ниже:
CREATE DOMAIN <domain name> [AS] <data type>
[default definition] [domain-constraint-definition-list] где <domain name> – название создаваемого домена; <data type> – поддерживаемый SQL тип данных, который является базовым для создаваемого домена; AS – необязательное ключевое слово, разделяющее названия домена и базового типа данных (в описании формата здесь и далее необязательные параметры будут записываться в квадратных скобках); default definition – необязательный параметр, определяющий значение по умолчанию, которое применяется к элементам каждого столбца, определенного на данном домене и не имеющего собственного определения значения по умолчанию; domain-constraint-definition-list – список ограничений целостности, применяемых к каждому столбцу, основанному на домене.
Например, нужно описать домены, на которых будут определяться столбцы приведенной ниже таблицы (табл. 7.1).
Таблица 7.1
Таблица STUDENTS
NUM |
NAME |
GROUP |
123 |
Иванов И.И. |
382 |
124 |
Петров П.П. |
382 |
Пусть первый домен будет основываться на типе INTEGER, но содержать ограничение на значение:
CREATE DOMAIN Dnum INTEGER CONSTRAINT ck_ValNum CHECK (VALUE >0)
Здесь Dnum – имя домена, CONSTRAINT – ключевое слово, означающее "ограничение", ck_ValNum – название создаваемого ограничения, которое заключается в проверке значения на условие "> 0". Если не задавать имя ограничения, ключевое слово CONSTRAINT тоже не пишется.
Второй домен – строки переменной длины до 50 символов со значением по умолчанию "???":
CREATE DOMAIN Dname VARCHAR(50) DEFAULT '???'
Третий домен – номер группы, размерностью не более трех десятичных символов:
CREATE DOMAIN Dgroup NUMERIC(3)
Существующий домен можно изменить с помощью оператора ALTER: ALTER DOMAIN <domain name> <alter domain action> Можно определить новое значение по умолчанию, удалить существующее, ввести новое ограничение целостности. Не будем подробно рассматривать формат этого оператора, разберем только два примера. Удалим ограничение на значение домена Dnum и добавим значение по умолчанию для домена Dgroup:
ALTER DOMAIN Dnum DROP CONSTRAINT ck_ValNum;
ALTER DOMAIN Dgroup SET DEFAULT 382
Существующий домен можно уничтожить оператором DROP DOMAIN. Его синтаксис:
DROP DOMAIN <domain name> {RESTRICT| CASCADE} где <domain name> – это имя домена. Если указывается RESTRICT, домен не будет уничтожен, если он использован в определении какого-либо столбца, представления или ограничения целостности. Если указана опция CASCADE, домен будет удален. Столбцы, определенные на этом домене, автоматически переопределяются следующим образом [15]:
- • считается, что каждый такой столбец теперь относится к типу данных, на основе которого определялся уничтожаемый домен;
- • если у столбца не было определено собственное значение по умолчанию, то считается, что теперь у него значение по умолчанию, которое было у уничтожаемого домена;
- • каждый столбец наследует все ограничения уничтожаемого домена.
Удалим созданный ранее домен Dnum:
DROP DOMAIN Dnum RESTRICT
Надо отметить, что в СУБД Microsoft SQL Server оператор CREATE DOMAIN не поддерживается. В данной СУБД подобную задачу можно частично решить с помощью оператора CREATE TYPE. Но этот оператор не позволяет задавать значения по умолчанию и ограничения на значения с помощью CHECK. Пример использования оператора:
CREATE TYPE Dcharl5 FROM CHAR(15) NOT NULL