- •Шехтман в. Е.
- •1. Базы данных и модели данных
- •1.1. Введение.
- •1.2. Файлы операционной системы
- •1.3. Пример базы данных.
- •1.4. Иерархическая модель данных
- •1.5. Сетевая модель данных
- •1.6. Инвертированные списки.
- •2. Введение в реляционную модель данных.
- •1.7. Реляционная модель данных
- •3. Реляционная алгебра
- •3.1. Теоретико-множественные операции.
- •3.2. Специальные операции ra
- •4. Нормализация данных
- •4.1. Полная декомпозиция.
- •Магазин товар ндс
- •Товар ндс
- •Магазин ндс
- •Товар ндс
- •Магазин товар ндс
- •4.2. Проблема дублирования данных.
- •1 Глобус 33-33-33
- •2 Глобус 33-33-33
- •4 Океан 77-77-77
- •4.3. Висячие записи.
- •Поставщик Тел
- •4.4. Проблемы, возникающие из-за неудачной структуры данных.
- •4.5. Пятая нормальная форма (5нф).
- •4.6. Функциональная зависимость.
- •4.7. Связь между фз и полной декомпозицией отношения.
- •4.8. Первая нормальная форма (1нф).
- •4.9. Вторая нормальная форма (2нф).
- •4.10. Третья нормальная форма (3нф).
- •4.11. Нормальная форма Бойса-Кодда (нфбк).
- •4.12. Многозначная зависимость.
- •4.13. Четвертая нормальная форма (4нф).
- •4.14. Пример нормализации.
- •4.15. Резюме. Нормальные формы.
- •5. Инфологическое моделирование.
- •5.1. Сущность и набор сущностей
- •5.2. Связи между сущностями.
- •5.3. Рекурсивная связь. Роли.
- •5.4. Множественные связи.
- •5.5. Суперсущности и производные сущности
- •5.6. Слабые наборы сущностей
- •5.7. Борьба с избыточнотью
- •5.8. Преобразование инфологической модели в физическую модель.
- •5.9. Пример инфологического моделирования.
- •6. Язык sql
- •6.1. История sql.
- •6.2. Структура sql.
- •6.3. Язык запросов
- •6.4. Простые запросы на выборку данных.
- •6.5. Агрегатные (групповые) функции.
- •6.6. Вложенные запросы
- •6.7. Внешние объединения
- •6.8. Изменение данных
- •Insert into r1 (o, fio, d) values (5, ‘Иванов’, ’бд’)
- •7. Представления.
- •8. Определение схемы базы данных и ограничений целостности
- •9. Транзакции
- •9.1. Свойства транзакций
- •9.2. Надежное хранение данных
- •9.3. Параллельное выполнение транзакций
- •9.3.1. Коллизия “пропавшие изменения” - lost update problem
- •9.3.2. Коллизия “промежуточные данные” - dirty read
- •9.3.3. Коллизия “Несогласованные данные” - unrepeatable read, inconsistent analysis
- •9.3.4. Коллизия “фантом” - phantom
- •9.4. Уровни изолированности
- •9.5. Тупики
- •10. Ограничение прав доступа в целях обеспечения безопасности
- •11. Физическая организация баз данных
- •11.1. Организация размещения данных.
- •11.2. Организация индексов
- •11.2.1. Поиск в бд.
- •11.2.2. Плотный индекс (индексно-прямые файлы).
- •11.2.3. Неплотный индекс (индексно-последовательные файлы).
- •11.2.4. Сбалансированные деревья.
- •11.2.5. Инвертированные списки.
- •12. Архитектура субд. Методы оптимизации запросов.
- •Логические преобразования запросов.
- •Преобразования запросов с изменением порядка реляционных операций.
- •13. Аналитические системы.
- •Анализ данных.
- •Хранилища данных
- •Типы ошибок
- •Способы реализации olap.
- •Требования к средствам реализации систем оперативной и аналитической обработки данных
- •Многомерная модель данных.
- •Разработка данных
- •14. Загружаемые процедуры.
- •In pr double precision)
- •If eof then leave Cl end if;
- •Insert into providers(code, name)
- •Values (nr.Codec, ‘*** новый поставщик ***’);
- •15.4. Модель сервера приложений (трёхзвенная архитектура, “тонкий клиент”)
- •Список литературы
- •15. Модели совместного доступа к бд
- •15.1. Файл-серверная модель.
- •15.2. Модель клиент-сервер с бизнес-логикой на клиенте.
- •15.3. Модель клиент-сервер с бизнес-логикой на сервере субд (хранимые процедуры и триггеры) и частично на клиенте.
If eof then leave Cl end if;
IF t=’ОВОЩ’ THEN
UPDATE GOODS SET NDS=10 WHERE CODE=c;
ELSE
UPDATE GOODS SET NDS=20 WHERE CODE=c;
END IF
END LOOP;
CLOSE c;
END;
Имеется особая разновидность загружаемых процедур, называемая триггер. Триггер – это загружаемая процедура, которая вызывается не из программы пользователя, а автоматически ядром СУБД. При создании триггера определяется условие, когда триггер должен сработать. Чаще всего триггеры используются для осуществления специфических проверок целостности данных, которые трудно или невозможно выразить с помощью языка определения данных и ограничений целостности (см. главу 8).
Пример: предположим, что выполняется попытка вставить запись о поставке товара с кодом поставщика, отсутствующим в таблице поставщиков PROVIDERS. Вместо того, чтобы отвергнуть такую запись, триггер может позволить предварительно вставить новую запись в таблицу поставщиков с искуственным именем поставщика. В результате не будет нарушена ссылочная целостность.
1 CREATE TRIGGER SUPTR
2 AFTER INSERT ON SUPPLIES
3 REFERENCING NEW ROW AS nr
4 FOR EACH ROW
5 WHEN (nr.CODEC NOT IN (SELECT CODE FROM PROVIDERS) )
Insert into providers(code, name)
Values (nr.Codec, ‘*** новый поставщик ***’);
Поясним строки:
объявление триггера по имени SUPTR.
событие, при возникновении которого триггер вызывается на выполнение (после вставки новой записи). Варианты: AFTER, BEFORE, INSTEAD OF. Варианты второй части условия: INSERT, DELETE, UPDATE.
REFERENCING позволяет ссылаться на объекты, которые либо вставляются, либо уничтожаются, либо модифицируются. Так, INSERT порождает ссылку на новую запись (NEW), DELETE на старую запись (OLD), UPDATE допускает оба варианта. Общий синтаксис:
REFERENCING {NEW | OLD} {TUPLE | TABLE} AS <имя>
задание уровня триггера. Триггеры бывают уровня записи (если задано FOR EACH ROW) и уровня процедуры (если эта фраза отсутсвует); триггер уровня записи применяется к каждой записи, триггер уровня процедуры применяется однажды при его вызове независимо от количества обрабатываемых строк.
действие триггера, его тело. Можно использовать все изобразительные средства загружаемых процедур.
Как известно, в общем случае нельзя модифицировать представления (см. Главу 7). Однако, используя триггеры можно реализовать модифицируемые представления.
Пример: вспомним представление POSTAVKI (см. Главу 7):
CREATE VIEW POSTAVKI AS
SELECT S.WEIGHT, S.PRICE, S.DAT, P.NAME NP, G.NAME NG,
P.CODE CP, G.CODE CG
FROM SUPPLIES AS S
LEFT JOIN PROVIDERS AS P ON S.CODEC = P.CODE
LEFT JOIN GOODS AS G ON S.CODEG = G.CODE
В это предсавление нельзя вставить новую запись. Однако, используя триггер INSTEAD OF (вместо) можно вставить новые данные не в представление (что не имеет смысла ввиду самой природы представления), а в те три таблицы, на которых оно основано.
CREATE TRIGGER POSTAVKI_MOD
INSTEAD OF INSERT ON POSTAVKI
REFERENCING NEW ROW AS nRow
FOR EACH ROW
DECLARE p, g
BEGIN
IF nRow.CG NOT IN (SELECT CODE FROM GOODS) THEN
INSERT INTO GOODS(CODE, NAME)
VALUES (nRow.CG, nRow.NG)
END IF;
IF nRow.CP NOT IN (SELECT CODE FROM PROVIDERS) THEN
INSERT INTO PROVIDERS(CODE, NAME)
VALUES (nRow.CP, nRow.NP)
END IF;
INSERT INTO SUPPLIES(WEIGHT, PRICE, DAT, CODEG, CODEC) VALUES (nRow.WEIGHT, nRow.PRICE, nRow.DAT, nRow.WEIGHT, nRow.CG, nRow.CP)
END;
