При попытке исполнения запроса: CREATE DOMAIN EMP_NO AS INTEGER CHECK (VALUE BETWEEN 1 AND 10000); Выдается ошибка: Неизвестный тип объекта "DOMAIN" в интсрукции CREATE, DROP или ALTER. Используется SQL Server MS SQL 2008R2 |
Общее введение, типы данных и средства определения доменов
Неявные и явные преобразования типа или домена
В языке SQL обеспечивается возможность использования в различных операциях не только значений тех типов, для которых предопределена операция, но и значений типов, неявным или явным образом приводимых к требуемому типу.
Неявные преобразования типов в SQL
В SQL поддерживается совместимость некоторых типов данных за счет неявного преобразования значений одного типа к значениям другого типа данных (например, при необходимости FLOAT неявно приводится к DOUBLE ). Опишем наиболее важные правила совместимости типов, принятые в SQL:1999. Начнем с определения приводимости типов. Тип данных A приводим к типу данных B в том и только в том случае, когда в любом месте, где ожидается значение типа B, может быть использовано значение типа A.
Основные правила приводимости типов состоят в следующем.
- Типы символьных строк. Тип CHARACTER (x) приводим к любому типу CHARACTER (y), если y>=x. Типы VARCHAR (x) и CHARACTER (x) приводимы к любому типу VARCHAR (y), если y>=x. Типы CHARACTER (x) и VARCHAR (x) приводимы к любому типу CLOB.
- Типы битовых строк. Тип BIT (x) приводим к любому типу BIT (y), если y>=x. Типы BIT VARYING (x) и BIT (x) приводимы к любому типу BIT VARYING (y), если y>=x.
- Типы BLOB. Тип BLOB (x) приводим к любому типу BLOB (y), если y>=x.
- Типы точных чисел. Тип EN (p1, s1) приводим к любому типу EN (p2, s2), у которого s2>=s1 и p2 определяется в реализации. Тип EN (p, s) приводим к любому типу приблизительных чисел AN (p1), где p1 определяется в реализации.
- Типы приблизительных чисел. Тип AN (p1) приводим к любому типу (p2), если p2>=p1.
Явные преобразования типов или доменов и оператор CAST
Неявные преобразования типов не всегда удобны, недостаточно гибки и иногда могут вызывать ошибки. Поэтому, как показывает предыдущий подраздел, число допустимых неявных преобразований типов в SQL весьма ограничено. Однако в SQL существует специальный оператор CAST , с помощью которого можно явно преобразовывать типы или домены в более широких пределах допускаемых преобразований. Конструкция имеет следующий синтаксис:
CAST ({scalar-expression | NULL } AS {data_type | domain_name})
Оператор преобразует значение заданного скалярного выражения к указанному типу или к базовому типу указанного домена. Результатом применения оператора CAST к неопределенному значению является неопределенное значение. Для значений, отличных от неопределенных, в стандарте приводятся подробные правила выполнения преобразований, которые интуитивно понятны.
Поясним действие оператора CAST в наиболее важных случаях. Примем следующие обозначения типов данных:
EN – точные числовые типы ( Exact Numeric )
AN – приблизительные числовые типы ( Approximate Numeric )
C – типы символьных строк ( Character )
FC – типы символьных строк постоянной длины ( Fixed-length Character )
VC – типы символьных строк переменной длины ( Variable-length Character )
B – типы битовых строк ( Bit String )
FB – типы битовых строк постоянной длины ( Fixed-length Bit String )
VB – типы битовых строк переменной длины ( Variable-length Bit String )
D – тип Date
T – типы Time
Пусть TD – это тип данных, к которому производится преобразование, а SD – тип данных операнда. Тогда допустимы следующие комбинации ("да" означает безусловную допустимость, "нет" – безусловную недопустимость и "?" – допустимость с оговорками).
По поводу ячеек таблицы, содержащих знак вопроса, необходимо сделать несколько оговорок:
- если TD – интервал и SD – тип точных чисел, то TD должен содержать единственное поле даты-времени;
- если TD – тип точных чисел и SD – интервал, то SD должен содержать единственное поле даты-времени;
- если SD – тип символьных строк и TD – тип символьных строк постоянной или переменной длины, то набор символов SD и TD должен быть одним и тем же.
Заключение
В этой лекции мы начали рассматривать средства языка SQL, позволяющие определять и динамически изменять схему базы данных. Наиболее важным для общего понимания языка является раздел "Типы данных SQL" – система типов языка SQL (и любой SQL -ориентированной базы данных). В последних стандартах языка SQL поддерживаются:
- развитый набор предопределенных типов, включая ряд параметризованных типов;
- генераторы типов массивов и мультимножеств, элементами которых могут быть значения предопределенных типов, типов коллекций, анонимных строчных типов строк и типов, определенных пользователями;
- генератор анонимных строчных типов, в которых типом элемента строки может быть любой предопределенный тип, тип коллекции, анонимный строчный тип и тип, определенный пользователями;
- определяемый пользователем структурный тип, в котором типом элемента структуры может быть любой предопределенный тип, тип коллекции, анонимный строчный тип и тип, определенный пользователями; для определяемых пользователем структурных и индивидуальных типов можно определять пользовательские операции.
Нельзя с уверенностью сказать, что система типов языка SQL настолько полна, что может удовлетворить любые потребности, но можно отметить, что в этой системе типов отсутствует единый логический подход и имеется избыточность. Возможно, это станет понятнее после обсуждения в конце курса средств объектно-реляционных расширений языка SQL.
Как должно быть ясно из этой лекции, механизм доменов в SQL играет вспомогательную роль. Это не совсем те (может быть, и совсем не те) домены, поддержка которых предполагается реляционной моделью. Фактически определение домена обеспечивает спецификацию ограничений и значений по умолчанию, выносимых за пределы определения столбца. В комитете по стандартизации SQL обсуждается идея полного отказа от поддержки механизма доменов и замены его на соответствующим образом адаптированный механизм индивидуальных типов (см. последнюю лекцию курса).