УЧИСЬ

Чернянка.RU

Главная
УЧИСЬ
Темы :
  • Основы установки сервера SQL 2000
  • Основы администрирования Сервера SQL 2000
  • Расширенная установка сервера SQL 2000
  • Введение в Диспетчер Предприятия (Enterprise Manager) сервера SQL 2000
  • Основы создания баз данных
  • Дополнительные темы, связанные с созданием баз данных
  • Резервное копирование баз данных
  • Создание плана аварийного восстановления. Часть I.
  • Создание плана аварийного восстановления. Часть II
  • Восстановление резервных копий и полное восстановление баз данных SQL 2000
  • Таблицы - Часть I - Основы
  • Таблицы - Часть 2 - Ссылочная целостность
  • Таблицы - Часть 3 - Проверка ограничений
  • SQL

    Таблицы - Часть 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. Но есть и хорошая новость: Диспетчер предприятия способен на основе введенного ограничения автоматически решать, на какой уровень его добавить  – уровень столбца или таблицы.

    ЭТО пока ВСЁ. Для начинающего информации хватит. Удачи

     

     

     


     

    Назад

    На главную

    В начало

    Чернянка
    Сайт управляется системой uCoz