Ограничения целостности



Дата07.07.2013
Размер53.9 Kb.
ТипДокументы
Ограничения целостности.
Коммерческие СУБД имеют более тонкие средства для задания ограничений целостности, чем диаграммы «сущность-связь» или язык реляционной алгебры.

  • Язык SQL используется для описания ограничений целостности.



Краткое описание.


  1. Первичный ключ (рассмотрен ранее).

  2. Внешний ключ = ограничения корректности ключей связанных таблиц.

  3. Проверки уровня атрибута и кортежа = ограничения внутри отношений

  4. SQL утверждения = глобальные ограничения.

  5. Oracle триггеры.

  • Используются в Oracle вместо SQL утверждений.



Внешние ключи.
В отношении R опция «атрибут А references S(B)» определяет, что конкретное значение атрибута(столбца) А отношения R должно присутствовать в столбце B отношения R.

  1. При этом В должен быть первичным ключом в отношении S.


Пример.
CREATE TABLE Beers (

name CHAR(20) PRIMARY KEY,

manf CHAR(20)

);
CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20) REFERENCES Beers(name),

price REAL

);


  • Другой способ – задать внешний ключ отдельным элементом при определении таблицы:


CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20),

price REAL,

FOREIGN KEY beer REFERENCES Beers(name)

);
Этот способ важен, если внешний ключ состоит из более чем одного атрибута.

Что произойдет если нарушается «внешний ключ»?
Две возможности:


  1. Вставка или обновление кортежа из Sells приводит к появлению значения beer , несуществующего в Beers(name).

    • Всегда отвергается


2. Удаление или обновление кортежа из Beers со значением name, на которое ссылается Sells(beer).

А). По умолчанию отвергается.

Б). Каскадирование: изменить значения атрибутов для ссылающихся кортежей Sells (с возможной рекурсией)
Пример.

  • Удаление Bud из Beers приводит к удалению всех соответствующих Bud кортежей из Sells.

  • Обновление Bud -> Budweiser приводит к замене значений столбца beer отношения Sells с Bud на Budweiser.


В). Установить NULL значение.

Пример.

  • Удаление Bud из Beers приводит к замене значений столбца beer всех соответствующих Bud кортежей из Sells с Bud на NULL.

  • Обновление Bud -> Budweiser приводит к тому же результату.



Выбор поведения при каскадировании.
К объявлению внешнего ключа добавить опцию

ON [DELETE, UPDATE] [CASCADE, SET NULL]
Пример.


CREATE TABLE Sells (


bar CHAR(20),

beer CHAR(20),

price REAL,

FOREIGN KEY beer REFERENCES Beers(name)

ON DELETE SET NULL

ON UPDATE CASCADE

);
«Правильное» поведение определяется дизайном базы данных. Что означает исчезновение пива из отношения Beers? Возможна ли ситуация, когда изменяется название пива?

Условия на атрибуты.
Следует за описанием атрибута и определяет условие, которое должно выполняться для всех кортежей отношения.


  • Форма CHECK(условие)

  • Условие может включать проверяемый атрибут и другие атрибуты этого же кортежа,

  • Атрибуты других отношения могут использоваться в подзапросах,

  • Oracle: не разрешается использование подзапросов.




  • Условие проверяется только при изменении проверяемого атрибута (т.е. при вставке и обновлении)


Пример.
CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20)

CHECK( beer IN (SELECT name FROM Beers)),

price REAL CHECK(price <= 5.00)

);
Проверка условия на beer похожа на ограничение внешнего ключа, за исключением того, что оно проверяется только при добавлении или изменении кортежа из Sells, но не проверяется при удалении кортежей из Beers.

Проверка условия на кортеж.
Является отдельным элементом при создании таблицы.


  • Форма подобна условию на атрибут

  • Может использовать любые атрибуты кортежа и логические операции для формирования логического выражения

  • Может использовать атрибуты других отношений в подзапросах

  • Напоминание: Oracle запрещает использование подзапросов в условиях




  • Условие проверяется при вставке или обновлении кортежа


Пример.
Только Joe’s бар может продавать пиво дороже $5.
CREATE TABLE Sells (

bar CHAR(20),

beer CHAR(20),

price REAL,

CHECK(bar = 'Joe''s Bar' OR price <= 5.00)

);

SQL утверждения.


  • Ограничения уровня схемы базы данных (глобальные)

  • Не представлены в Oracle.

  • Проверяется при каждом изменении отношения, используемого в утверждении.

  • Синтаксис:


CREATE ASSERTION <имя> CONDITION <условие>
Пример 1. Никакой бар не может устанавливать цены, чтобы средняя цена была выше $5.
Sells(bar, beer, price)
CREATE ASSERTION NoRipoffBars

CHECK(NOT EXISTS( SELECT bar

FROM Sells

GROUP BY bar

HAVING 5.0 < AVG(price)

)

);

Проверяется при любом изменении отношения Sells.

Пример 2. Число баров не может больше числа посетителей.
Bars(name, addr, license)

Drinkers(name, addr, phone)
CREATE ASSERTION FewBar

CHECK( (SELECT COUNT(*) FROM Bars) <=

(SELECT COUNT(*) FROM Drinkers)

);
Проверяется при изменении Bars или Drinkers.

Триггеры (версия Oracle).
Часто называются правилами «событие-условие-действие».


  • Событие = класс изменений в базе данных, например, «вставка кортежа в отношение Beers»

  • Условие = проверка условия, подобная проверке в опции WHERE, определяющая, будет ли отрабатывать триггер

  • Действие = один или несколько SQL операторов

  • Отличается от SQL утверждения тем, что система не должна определять, когда выполнять триггер, он активизируется событием

  • Отличается от CHECK тем что, может использовать условия, недопустимые в CHECK.

Пример. При вставке нового кортежа в Sells гарантировать существование соответствующего пива в Beers, если пиво там отсутствует, то добавить его со значением manf = NULL.
Sells(bar, beer, price)
CREATE OR REPLACE TRIGGER BeerTrig

AFTER INSERT ON Sells

FOR EACH ROW

WHEN(new.beer NOT IN (SELECT name FROM Beers) )

BEGIN

INSERT INTO Beers(name)

VALUES(:new.beer);

END;

.

RUN

Варианты.


  1. Можно опустить OR REPLACE. Однако в этом случае существование триггера с таким именем вызовет ошибку, и старый триггер останется неизмененным.

  2. Вместо AFTER можно использовать BEFORE.

  3. В случае, когда отношение является представлением(VIEW), вместо AFTER можно использовать INSTEAD OF. Это позволяет провести модификацию представления путем модификации отношения, лежащего в его основе.

  4. Вместо INSERT может использоваться DELETE или UPDATE OF <атрибут>.

  5. FOR EACH ROW можно опустить. При этом действие будет выполнено только один раз для отношения.



Замечания.


  • Больше информации на WEB-странице курса (Использование Oracle PL/SQL)




  • Две специальных переменные new и old представляют новый и старый кортежи при изменении отношения.

  • old не имеет смысла при вставке, также как new – при удалении




  • в WHEN new и old используются без двоеточия, которое необходимо при описании действия.




  • Действие – это PL/SQL оператор

  • В простейшем виде – несколько SQL операторов, заключенных между BEGIN и END

  • Допускается лишь ограничение вида «SELECT-FROM-WHERE»




  • . и RUN вызывают запись триггера в базу данных

  • Oracle триггеры являются частью схемы базы данных вместе с таблицами и представлениями




  • важное ограничение Oracle: действие не может изменить отношение, изменение которого вызвало данный триггер

  • хуже того, действие не может даже изменить отношение, связанное с данным (изменение которого вызвало триггер) ограничением целостности, т.е. которое имеет внешний ключ ссылающийся на данное отношение.



Пример.
Поддерживать список баров, увеличивающих цену сразу более чем на $1
Sells(bar, beer, price)

RipoffBars(bar)
CREATE TRIGGER PriceTrig

AFTER UPDATE OF price ON Sells

FOR EACH ROW

WHEN(new.price > old.price + 1.00)

BEGIN

INSERT INTO RipoffBars

VALUES(:new.bar);

END;

.

RUN

Похожие:

Ограничения целостности iconКонцепция целостности харьков: Изд-во Харьковского гос ун-та, 1987
Экспликация концепции целостности на основе идеи относительности понятия множества в описании физической реальности
Ограничения целостности iconЛекция №4. Закономерности систем
Целостность. Закономерность целостности проявляется в системе в возникновении новых интегративных качеств, не свойственных образующим...
Ограничения целостности icon3 Обеспечение целостности информации
Например, такой подход пригоден в случае, когда целостность информации играет важную роль, а конфиденциальность не требуется. На...
Ограничения целостности iconПольша: ограничения на движение грузового автомобильного транспорта 7 июля 2011 Общие ограничения
С 18. 00 до 22. 00 час в канун официальных праздников, перечисленных ниже в пунктах b – j (см перечень праздничных дней)
Ограничения целостности iconНормативные требования к прочности и надёжности элементов ру ввэр и вопросы безопасности
О сохранении в аварии целостности барьеров безопасности речи не идёт, поскольку нарушение целостности одного из барьеров безопасности,...
Ограничения целостности icon2 ограничения для работы на усн
Статья 346. 12 Нк РФ установила ограничения на применение "упрощенки". Их достаточно много, но все их для удобства можно разделить...
Ограничения целостности iconОграничения труда подростков
Большинство из этих ребят еще не достигли совершеннолетия. Поэтому в силу специфики особенностей строения организма и восприимчивости...
Ограничения целостности icon2005 – 10 – 11. Понятие «мала» (ограничения), их виды. Определиться с самоидентификацией
К примеру, если ты не знаешь, какие у тебя есть ограничения, ты не можешь дальше правильно работать со своим освобождением. Когда...
Ограничения целостности iconСовременный анархизм
Навязанные государством ограничения могут затрагивать только ту активность, которая прямо, неотвратимо и существенно ущемляет права...
Ограничения целостности iconЛекции количественные ограничения и их формы Технические барьеры в международной торговле
Количественные ограничения – форма нетарифного регулирования торгового оборота, определяющая количество и номенклатуру товаров, разрешенных...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org