Создание доменов

В 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

 
< Пред   СОДЕРЖАНИЕ     След >