Термины «безопасность» и «целостность» часто используются совместно, хотя это различные понятия. Термин «безопасность» относится к защите данных от несанкционированного или непреднамеренного доступа, изменения или разрушения данных.
Целостность – поддержание согласованности и истинности данных, то есть поддержание данных в непротиворечивом состоянии.
Понятия сходны тем, что при обеспечении как безопасности, так и целостности, СУБД должна проверять, не нарушают ли выполняемые пользователем действия определенных правил. Правила задаются разработчиком ИС при создании БД.
Можно выделить 2 уровня безопасности и целостности:
- 1 уровень – программный. Подразумевает наличие кода в программе, не позволяющего вносить некорректные данные или запрещающего доступ к данным определенным пользователям.
- 2 уровень – уровень СУБД. Реализация правил безопасности и целостности на уровне СУБД.
Обеспечивать безопасность и целостность на уровне СУБД обязательно. В программах желательно дублировать эти ограничения, но только для того, чтобы не пугать пользователя сообщениями об ошибках, получаемых напрямую из СУБД.
Необеспечение безопасности и целостности на уровне приложения не приведет ни к каким глобальным последствиям, а отсутствие их на уровне СУБД может привести данные в некорректное состояние или к разглашению конфиденциальной информации.
В стандарте SQL присутствуют конструкции, с помощью которых можно задавать правила безопасности и целостности (домены, ключи, пользователи, роли). Кроме того, большинство СУБД реализуют дополнительные элементы, расширяющие эти правила. К таким элементам можно отнести представления, хранимые процедуры и триггеры.
Представления – статическое определение динамической таблицы, созданное на основе запроса на выборку из таблиц, реально хранящихся в базе данных или из других представлений. С технической точки зрения, представления это хранимое в базе данных определение инструкции select с заданным набором атрибутов и условиями отбора кортежей. После определения представления на него можно ссылаться как на таблицу.
Отметим, что представление не создает копию данных базовых таблиц. При обращении к нему происходит выполнение соответствующего запроса на существующих в момент обращения данных. Синтаксис:
Create view <имя представления> [(атрибут 1, [атрибут 2…])] – список имен полей представления
As <оператор select> [with check option]
Create view dep21 (name) as select name from empl where depno=21
Преимущества использования представлений:
- эффективность (по сравнению с многократным выполнением запроса) – представление компилируется и оптимизируется 1 раз: при создании или при первом выполнении, затем при обращении план выполнения запросов уже не вычисляется.
- безопасность. Пользователям можно не давать прав на базовые таблицы, а все обращение к данным вести через представление, таким образом, ограничиваются столбцы и кортежи, с которыми пользователь может работать.
- логическая независимость от данных. При изменении концептуальной схемы базы данных изменяется только текст запроса представления, но не приложение, использующее его. То есть, пользователи этого представления не затронут изменения в структуре базы данных.
Бывают два вида представлений: только для чтения и обновляемые представления.
Требования обновляемости представлений:
1) Представление должно определять подмножества только одной таблицы или другого модифицируемого представления.
2) Представление должно включать первичный ключ таблицы.
3) Все исключаемые колонки должны допускать null-значение.
4) Представление не должно использовать функций агрегирования и разделы group by и having
5) Представление не должно использовать подзапросы.
Таким образом, модифицируемое представление можно рассматривать как таблицу, из которой вырезаны определенные компоненты наложением определенных же ограничений.
Создать представление о служащих, у которых невысокая зарплата:
Create view empl1 as select * from empl where salary<1000
Вставим запись:
Insert into empl1 values (12,’Федоров’,’менеджер’, 1200, 21)
Новая запись будет вставлена в основную таблицу, но для представления empl1 она окажется невидимой. Чтобы запретить включение исчезающих записей, в конце определения представления пишут:
Create view empl1 as select * from empl where salary<1000 with check option
В данном случае при вставлении новой записи возникнет ошибка.
С помощью представлений можно также удалять строки из базовых таблиц, при этом через представление нельзя удалить строки, не удовлетворяющие критерию where select-инструкции представления.
На модификацию строк таблиц через представления действуют такие же ограничения, что и на удаление, и на вставку.
Пример: пусть имеется таблица «Факультет» <код факультета, название факультета> и связанная с ней таблица «Специальность» <код специальности, название специальности, код факультета>. Построим представление, выводящее информацию о специальности и названии факультета, которому принадлежит специальность:
Create view spec
As select s.spec_code, s.spec_name, d.dep_name
From speciality s, department d
Where s.dep_code=d.dep_code
Таким образом, отсекаем ненужную информацию и упрощаем запросы:
Select * from spec
Знание структуры базы данных становится не необходимым.
Пусть имеются таблицы – Продавец <номер продавца, фамилия продавца, процент с продажи>, Продажа <номер сделки, номер продавца, проданное количество, стоимость единицы товара>. Создадим представление, выводящее фамилию и общий доход продавцов:
Create view income (fio, summ)
As select фамилия продавца, sum ((количество*стоимость единицы товара)*процент с продажи)