Ограничения целостности. Коммерческие СУБД имеют более тонкие средства для задания ограничений целостности, чем диаграммы «сущность-связь» или язык реляционной алгебры.
Язык SQL используется для описания ограничений целостности.
Краткое описание.
Первичный ключ (рассмотрен ранее).
Внешний ключ = ограничения корректности ключей связанных таблиц.
Проверки уровня атрибута и кортежа = ограничения внутри отношений
SQL утверждения = глобальные ограничения.
Oracle триггеры.
Используются в Oracle вместо SQL утверждений.
Внешние ключи. В отношении R опция «атрибут А references S(B)» определяет, что конкретное значение атрибута(столбца) А отношения R должно присутствовать в столбце B отношения R.
При этом В должен быть первичным ключом в отношении 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)
); Этот способ важен, если внешний ключ состоит из более чем одного атрибута.
Что произойдет если нарушается «внешний ключ»? Две возможности:
Вставка или обновление кортежа из 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)
Триггеры (версия 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
Варианты.
Можно опустить OR REPLACE. Однако в этом случае существование триггера с таким именем вызовет ошибку, и старый триггер останется неизмененным.
Вместо AFTER можно использовать BEFORE.
В случае, когда отношение является представлением(VIEW), вместо AFTER можно использовать INSTEAD OF. Это позволяет провести модификацию представления путем модификации отношения, лежащего в его основе.
Вместо INSERT может использоваться DELETE или UPDATE OF <атрибут>.
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)
Лекция №4. Закономерности систем Целостность. Закономерность целостности проявляется в системе в возникновении новых интегративных качеств, не свойственных образующим...
3 Обеспечение целостности информации Например, такой подход пригоден в случае, когда целостность информации играет важную роль, а конфиденциальность не требуется. На...
2 ограничения для работы на усн Статья 346. 12 Нк РФ установила ограничения на применение "упрощенки". Их достаточно много, но все их для удобства можно разделить...
Ограничения труда подростков Большинство из этих ребят еще не достигли совершеннолетия. Поэтому в силу специфики особенностей строения организма и восприимчивости...
Современный анархизм Навязанные государством ограничения могут затрагивать только ту активность, которая прямо, неотвратимо и существенно ущемляет права...