Таблицы - Часть 3 - Проверка ограничений
Добро пожаловать в 13-ую статью
серии «Изучи администрирование SQL
Server за 15 минут в неделю!». В прошлой
статье мы рассматривали ACID-свойства
и ссылочную целостность. Статья
этой недели освещает проверку
ограничений (check
constraint).
Темы этой статьи:
- Логические выражения
- Создание проверки ограничений
Логические выражения
Проще говоря, проверка ограничения -
это булево выражение, принимающее
значение TRUE
либо FALSE
(вариант с NULL упомяну чуть позже).
Когда добавляется либо обновляется
строка таблицы, выполняется
проверка на соответствие данных
всем созданным ограничениям. Если
какая-либо из проверок ограничений
возвращает значение FALSE,
происходит откат транзакции. Если
все ограничения возвращают
значения, отличные от FALSE,
транзакция продолжается. Я говорю
"отличные от FALSE", поскольку значение NULL несет
с собой трехвариантную логику. NULL
или неизвестное значение не
повлечет отката транзакции - это
случится только в
результате возврата проверкой
ограничения значения FALSE.
Например, имеется таблица, в которой
сотрудники фирмы отмечают
расстояние в милях до места своей
работы. Мы могли бы использовать
следующую проверку ограничения,
чтобы максимально допустимое число
миль было равным 100:
miles <= 100
Это выражение будет возвращать TRUE,
если значение в miles (имя столбца)
меньше или равно 100. Знак <=
называется оператором сравнения и
должен быть знаком каждому, кто
знаком с основами программирования.
SQL Server поддерживает нижеследующие
операторы сравнения, которые можно
применять ко всем типам данных,
кроме text, ntext, и image:
Оператор |
Значение |
= |
Равно |
> |
Больше |
< |
Меньше |
>= |
Больше либо равно |
<= |
Меньше либо равно |
<> |
Не равно |
!= |
Не равно* |
!< |
Не более* |
!> |
Не менее* |
Эти операторы сравнения не
являются стандартными для SQL, но
реализованы в SQL Server.
Другим типом допустимых операторов
являются логические операторы,
такие как AND
и OR.
К примеру, мы можем добавить больше
ограничений на число миль с помощью
оператора AND.
Вот как можно добавить условие,
чтобы каждая поездка была длиной
больше чем 0 миль:
miles > 0 AND miles <= 100
Теперь наше новое ограничение
проверки позволяет вводить мили в
диапазоне от 1 до 100.
Итак, мы рассмотрели проверку
ограничения уровня столбца,
поскольку эти ограничения
затрагивают только один столбец.
Вдобавок к этому, мы можем создавать
ограничения, затрагивающие
несколько столбцов одной и той же таблицы и одной и той же строки
– известные как проверка
ограничения уровня таблицы.
Выделение слов "одной и той же"
не случайно, потому что проверка
ограничений не может ссылаться на
столбцы других таблиц, кроме той, в
которой они созданы. Кроме того, они
могут ссылаться только на текущую
строку этой таблицы.
К примеру, имеется таблица для
хранения адресов клиентов,
содержащая столбцы country и region. Мы
хотим добавить ограничение, по
которому, при указании в столбце
country значения "USA", region должен
хранить двухбуквенное сокращение
имени штата. Вместо того чтобы
писать выражение с оператором OR для
каждого из названий штатов,
используем оператор IN. (список
сокращенных названий укорочен для
читабельности).
country <> 'USA' OR region IN ('AL','FL', 'GA')
Можно придумать еще, как минимум,
полдюжины разных способов создать
ограничение, соответствующее
требованию этой задачи.
Хотя понимание основ работы
логических выражений важно, их
написаниеявляется в большей
степени проблемой программирования
базы данных, а не ее
администрирования. Кроме
упомянутых, существует еще
множество операторов, которые можно
использовать в проверке
ограничений, поэтому, если вы не
обладаете большим опытом написания
логических выражений в SQL
Server
и хотите узнать больше, я
рекомендую поискать в справочной
системе Books Online тему, посвященную
приоритету операторов. Порядок
выполнения операторов и обработка
значений NULL могут повлечь
неожиданные результаты, даже если у
вас уже есть немалый опыт работы.
Создание проверки ограничений
Итак, как мы можем добавить проверку
ограничения к таблице или столбцу?
Практически, как и во всем, что
касается SQL Server, мы можем
использовать для этой цели как
операторы SQL, так и Диспетчер
предприятия (Enterprise Manager). Я собираюсь
показать, как добавить проверку
ограничения, используя Диспетчер
предприятия, а вы можете посмотреть
также справку по синтаксису
операторов CREATE TABLE и ALTER TABLE в Books Online.
То, что мы собираемся сделать – это
добавить к таблице Customers в базе
данных Northwind проверку ограничения,
похожую на рассмотренное выше
ограничение для столбцов country/state.
Откройте ваш Диспетчер предприятия,
выберите свой сервер, раскройте
папку Databases (базы данных), затем базу
Northwind и выберите Tables
(таблицы). Затем щелкните правой
клавишей таблицу Customers и выберите
пункт Design
Table
(разработка таблицы). Откроется
соответствующее окно:

Затем щелкните на значке Manage Constraints (управление ограничениями) на панели инструментов. Вот как он выглядит:
Когда появится окно Properties, щелкните кнопку New и введите следующее выражение в поле ввода Constraint expression (и опять, данный список является укороченным):
Country <> 'USA' OR Region IN ('AL', 'AK', 'CA', 'FL', 'GA', 'ID', 'MT', 'NM', 'OR', 'WA', 'WY')
И последнее, в поле Constraint name (имя ограничения) введите CK_Customers_USA_Region. Вот что получится:

Прежде чем закрыть это окно,
рассмотрим, зачем нужны три опции
внизу окна:
- Check existing data on creation (проверять
существующие данные при создании):
будет проверять все существующие в
таблице данные, чтобы обнаружить
строки, не удовлетворяющие новому
ограничению. Заметим однако, что
проверка не выполнится, пока
таблица не будет сохранена, и если
обнаружатся конфликтные строки, то
появится сообщение об ошибке, а
изменения в таблице не сохранятся.
Можно оставить эту опцию
выключенной, чтобы ограничение
применялось только к вновь
создаваемым, либо обновляемым
строкам.
- Enforce
constraint
for
replication
(проверять ограничение при
репликации): будет отслеживать
выполнение этого ограничения в
случае репликации таблицы в другую
базу данных. О репликации мы еще
будем говорить в последующих
статьях этой серии.
- Enforce
constraint
for
INSERT
and
UPDATE
(поверять ограничение для
операторов INSERT и UPDATE):
будет выполнять ограничение для
любых операций INSERT и UPDATE
применительно к этой таблице.
Закройте окно Properties
и сохраните таблицу. Если вы
получили сообщение об ошибке "Unable
to
add
constraint
'CK_Customers_USA_Region' (невозможно добавить
ограничение 'CK_Customers_USA_Region')",
возможно вы имеете в таблице строки,
не являющиеся частью исходной базы
данных Northwind, для которых Country="USA"
и сокращение в столбце Region не
удовлетворяет созданному
ограничению.
Еще одна вещь, которую надо иметь в
виду, создавая проверку ограничения
в Диспетчере предприятия.
Единственное место, где вы можете
создать их – вкладка окна свойств
таблицы (см. выше). Другими словами, в
Диспетчере предприятия нет способа
указать, что ограничение должно
быть привязано к столбцу, а не к
таблице, как это можно сделать в
операторе CREATE TABLE. Но есть и хорошая
новость: Диспетчер предприятия
способен на основе введенного
ограничения автоматически решать,
на какой уровень его добавить – уровень столбца или таблицы.
ЭТО пока ВСЁ. Для начинающего информации хватит. Удачи