- •Содержание
- •Введение
- •1. Основные понятия
- •1.1 Терминология, базовые принципы
- •1.1.1 Понятие базы данных, субд и информационной системы
- •1.1.2 База данных и субд
- •1.1.3 Принципы построения информационных систем
- •1.2.2 Архитектура «файл-сервер»
- •1.2 Архитектуры информационных систем
- •1.2.1 Понятие архитектуры информационной системы
- •1.2.3. Архитектура «клиент-сервер»
- •1.2.4 Многозвенные архитектуры
- •1.2.5. Информационные системы на основе web-архитектуры
- •1.2.6 Информационные системы, функционирующие в терминальном режиме
- •1.3 Модели данных
- •1.3.1 Сравнительная характеристика моделей данных
- •1. Иерархическая модель данных
- •2. Сетевая модель данных
- •3. Реляционная модель данных
- •4. Постреляционная модель данных
- •5. Объектно-ориентированная модель данных
- •1.3.2 Неформальное введение в реляционную модель
- •1. Таблицы и связи
- •2. Первичные, альтернативные и внешние ключи
- •3. Null-значения
- •4. Метаданные. Схема базы данных
- •5. Правила ссылочной целостности
- •2. Реляционная модель
- •2.1 Реляционная модель. Структурная и целостная части
- •2.1.1 Структурная часть
- •2.1.2 Атрибуты и домены. Схема отношения
- •2.1.3 Кортежи. Отношение
- •2.1.4 Потенциальные ключи. Первичный ключ
- •2.1.5 Внешние ключи
- •2.1.6 Целостная часть реляционной модели
- •2.2 Манипуляционная часть реляционной модели
- •2.2.1 Реляционная алгебра
- •2.2.2 Реляционное исчисление
- •3. Проектирование базы данных
- •3.1 Семантический анализ предметной области
- •3.1.1 Трехуровневая модель ansi/sparc
- •3.1.2 Диаграммы «сущность - связь»
- •3.1.3 Case-технологии и case-системы
- •3.1.4 Методология idef1
- •3.2 Нормализация базы данных
- •3.2.1 Определение функциональной зависимости
- •3.2.2 Математические свойства фз, теоремы
- •3.2.3 Процедура нормализации. Декомпозиция отношений
- •3.2.4 Нормальные формы
- •3.3 Денормализация. Хранилища данных
- •3.3.1 Недостатки нормализованной базы данных
- •3.3.2 Oltp и olap-системы. Data Mining
- •3.3.3 Хранилища данных
- •4. Язык sql
- •4.1 Язык ddl. Основные объекты базы данных
- •4.1.1 Общий вид команд ddl
- •4.1.2 Основные объекты бд
- •4.2 Команды ddl для работы с таблицами
- •4.2.1 Создание таблицы
- •Типы даты и времени
- •4.2.2 Удаление таблиц и изменение их структуры
- •4.2.3 Пример создания базы данных
- •4.2.4 Создание таблиц на основе других таблиц
- •4.3 Команды манипулирования данными
- •4.3.1 Команда insert
- •Insert into имя_таблицы [(список_имен_столбцов)]
- •Values (список значений)
- •Insert into имя таблицы [(список столбцов)]
- •4.3.2 Команда delete
- •4.3.3 Команда update
- •4.4 Команда выборки данных (select)
- •4.4.1 Запросы на выборку по одной таблице
- •4.4.2 Соединение таблиц в запросах
- •Декартово произведение
- •Внутреннее (естественное) соединение таблиц
- •4. Самосоединения
- •4.4.3 Вложенные запросы
- •4.4.4 Комбинированные запросы
- •4.5 Представления (view)
- •4.5.1 Понятие представления
- •4.5.2 Создание и удаление представлений
- •4.5.3 Обновление представлений
- •4.5.4 Стандартные представления словаря данных Oracle
- •4.6 Хранимый код. Триггеры
- •4.6.1 Процедурные расширения языка sql
- •1. Оператор присваивания
- •2. Условный оператор
- •3. Операторы цикла
- •4.6.2 Использование команд sql в хранимом коде
- •4.6.3 Хранимые процедуры и функции
- •4.6.4 Триггеры
- •1. Триггер на вставку нового студента
- •2. Триггеры на удаление студента
- •3. Триггер на изменение оценки
- •5. Управление доступом к данным
- •5.1 Система безопасности субд
- •Разграничение доступа пользователей.
- •5.1.1 Разграничение доступа пользователей
- •Identified by пароль
- •5.1.2 Привилегии и роли
- •5.1.3 Аудит действий пользователей
- •5.2 Поддержка транзакций
- •5.2.1 Свойства транзакции
- •5.2.2 Поддержка транзакций в языке sql
- •5.2.3 Механизмы субд для поддержки транзакций
- •5.3 Настройка производительности. Индексы
- •5.3.1 Понятие индекса
- •5.3.2 Обзор индексов Oracle
- •Заключение
- •Библиографический список
4.5.2 Создание и удаление представлений
Поскольку представление является объектом базы данных, для его создания используется стандартная команда языка DDL CREATE…
Create VIEW имя [(список_столбцов)]
as
select …// любой запрос на выборку
Команда проста, поскольку все, что нужно для создания представления – его имя и запрос на выборку, который лежит в основе данного представления. Список столбцов представления должен быть указан явно, если в запросе присутствуют вычисляемые столбцы без указания псевдонима. В остальных случаях столбцы представления получат такие же имена, как используемые в запросе столбцы таблиц. Все же рекомендуется задавать список столбцов в явном виде.
Например, создадим представление, содержащее столбцы «код студента, фамилия студента, его средний балл» :
Create VIEW stud_mark (cod_st, name_st, avg_mark)
as
select st.cod_st, st.name_st, avg(m.mark)
from students st left join marks m
on st.cod_st=m.cod_st
GROUP BY st.cod_st, st.name_st
При создании представления пользователю не возвращается виртуальная таблица, которую он обычно получает при выполнении SELECT… Вместо этого, он получит лаконичное сообщение типа «Представление создано».
Для того, чтобы материализовать представление, т.е. получить данные в виде виртуальной таблицы, необходимо выполнить запрос SELECT к представлению так же, как к обычной таблице:
Select * from stud_mark
Можно написать и любой другой запрос на выборку к представлению:
Select cod_sub, avg_mark from stud_mark
where cod_st=123
Удаляется представление также стандартными средствами DDL:
DROP VIEW имя_представления
Выполнив последовательно команды DROP VIEW…, а затем снова CREATE VIEW … с тем же самым запросом SELECT, мы не напрасно потеряем время. Во многих случаях СУБД сформирует новый план исполнения того же самого запроса в соответствии с изменившимся наполнением таблиц или появлением новых индексов. Это приведет к сокращению времени материализации представления.
СУБД Oracle позволяет изменить план исполнения запроса без удаления представления, используя команду:
alter VIEW имя recomplile
4.5.3 Обновление представлений
На некоторые представления можно писать запросы Update, Delete и Insert, как на обычные таблицы. При выполнении таких запросов реально все изменения вносятся в физические таблицы.
Такие представления называются обновляемыми. Согласно стандарту SQL, обновляемыми являются представления, основанные на запросах:
только по одной таблице
запрос не должен содержать ключевых слов DISTINCT, GROUP BY, HAVING
не должен содержать вложенных запросов
не должен быть комбинированным, т.е. недолжен содержать операций UNION, INTERSECT, EXCEPT (MINUS).
Oracle, дополнительно, не позволяет обновлять запросы с сортировкой результатов.
Таким образом, обновляемых представлений не так и много:
представления с отбором столбцов (вертикальные представления)
представления с отбором строк (горизонтальные представления)
представления с отбором строк и столбцов (смешанные представления).
Например, создадим горизонтальное представление на основе выборки из таблицы оценок marks, содержащее только оценки по Математике.
Предварительно мы выяснили из таблицы предметов subjects, что математика имеет код 1.
Тогда для создания представления потребуется выполнить команду:
Create VIEW mark_1
as
select * FROM marks
WHERE cod_sub=1
Это представление будет обновляемым, поэтому преподаватель математики, которому разрешено обновление этого представления, может изменить любую (одну) оценку, например, таким запросом:
UPDATE mark_1 SET mark=5 WHERE cod_st=123
Однако, запрос:
UPDATE mark_1 SET cod_sub=2 WHERE cod_st=123
который также, как и первый, является разрешенным, приведет к неожиданным последствиям. Обновленная строка окажется за пределами представления mark_1 и запрос:
SELECT * FROM mark_1
эту строку не покажет.
Если такой побочный эффект нежелателен, в команду CREATE VIEW … следует добавить дополнительную фразу WITH CHECK OPTION:
DROP VIEW mark_1
Create VIEW mark_1
as
select * FROM marks WHERE cod_sub=1
WITH CHECK OPTION
Теперь при любой попытке изменить код предмета или добавить предмет с кодом, отличным от единицы, будет выдано сообщение об ошибке.
Если говорить о данном конкретном примере, то можно было бы поступить еще проще: не включать столбец cod_sub в представление, тогда у преподавателя математики просто не будет никакой возможности изменить (нечаянно или преднамеренно) код своего предмета.
