Механизмы защиты данных в SQL 126 Два типа угроз: – Внесение некорректных изменений – Несанкционированный доступ (нарушение конфиденциальности) • Локальные средства поддержания целостности данных – ограничения на атрибуты и таблицы, внешние ключи и т.д. • Глобальные механизмы защиты данных в SQL: – Представления – Привилегии – Транзакции Механизм представлений в SQL • Представления (VIEW) ограничивают доступ к базе данных из приложений • Представление – виртуальное отношение (таблица), как правило, создается для работы с базой данных из приложений • Создание представления: CREATE VIEW <имя_представления> AS <выборка SELECT> • Пример: создать представление, в которое поместить данные о поставщиках, не проживающих в Москве CREATE VIEW SuppliersNotMsk AS SELECT * FROM Suppliers WHERE City <> ‘Москва’ • Замечание: таблица SuppliersNotMsk является виртуальной - мы как бы 127 накладываем на базовую таблицу Suppliers маску, через которую часть кортежей становятся недоступными в представлении • Можно сделать недоступными в представлении атрибуты базовой таблицы • Пример: создать представление, в которое поместить все данные о поставщиках, кроме рейтинга CREATE VIEW SuppliersNotRating AS SELECT CodS, Surname, City FROM Suppliers • Еще один пример полезного использования представлений: CREATE VIEW SuppliersStat AS SELECT CodS, COUNT(*), SUM(Quant), AVG(Quant) FROM SupDet GROUP BY CodS • Представления – это надёжный интерфейс, через который мы получаем доступ к базовым таблицам , скрывая их внутреннее устройство • Активное использование представлений считается признаком хорошего проектирования баз данных SQL • Проблема обновляемости представлений: – оператор SELECT может неограниченно использоваться для выборки данных из базовых таблиц через представления – имеются существенные ограничения на изменение данных через представления операторами INSERT, DELETE, и UPDATE Базовые принципы механизма привилегий в SQL 128 Контроль прав доступа данного пользователя к таблицам БД производится на основе механизма привилегий • Каждый пользователь имеет специальное идентификационное имя или номер (ID пользователя) • Вход в систему пользователь может выполнить только под своим ID, зарегистрированным в системе • Каждому пользователю (ID пользователя) назначается некоторый набор привилегий – действий, которые ему доступны • Операторы SQL для системы привилегий: – GRANT – назначить привилегию – REVOKE – лишить привилегии • Примеры: Назначить Ivanov право добавлять и удалять строки в таблице SupDet GRANT INSERT, DELETE ON SupDet TO Ivanov Назначить Sidorov право выполнять любые действия в таблице SupDet GRANT ALL ON SupDet TO Sidorov Назначить всем право изменять атрибут Quant в таблице SupDet GRANT UPDATE ON SupDet(Quant) TO PUBLIC Лишить Petrov права добавлять и удалять строки в таблице Supplies REVOKE INSERT, DELETE ON Supplies FROM Petrov • 129 Механизм транзакций в SQL • Механизм транзакций обеспечивает возможность восстановления целостного состояния базы данных после ошибок пользователя, программных или аппаратных сбоев • Транзакция в SQL – это группа логически связанных операторов SQL, которые должны быть либо выполнены все вместе, либо не должен быть выполнен ни один из них • Основное свойство транзакции: до начала выполнения транзакции и после ее завершения база данных должна находиться в целостном состоянии, транзакция переводит базу данных из одного целостного состояния в другое • Транзакция может рассматриваться как минимальная единица активности пользователя по отношению к базе данных • Пример: удалить из базы данных поставщика с кодом S2 • Очевидно, необходимо сначала решить вопрос с поставками, например, передать их поставщику S4, поэтому операции передачи поставок другому поставщику и удаления поставщика из таблицы необходимо объединить в одну транзакцию • Транзакция удаления из базы данных поставщика с кодом S2 : UPDATE SupDet SET CodS = 'S4' WHERE CodS = 'S2‘; DELETE FROM Suppliers WHERE CodS = 'S2'; • • • • 130 Транзакция должна заканчиваться одной из двух команд: COMMIT; – фиксирует в базе данных все изменения, сделанные в ходе выполнения транзакции ROLLBACK; – отменяет все изменения, сделанные в ходе выполнения транзакции, не фиксируя их в базе данных (откат) В PostgreSQL транзакция определяется набором SQL-команд, окружённым командами BEGIN и COMMIT/ROLLBACK BEGIN; -- открываем транзакцию UPDATE SupDet SET CodS = 'S4' WHERE CodS = 'S2‘; DELETE FROM Suppliers WHERE CodS = 'S2'; COMMIT; -- закрываем транзакцию (или ROLLBACK; ) На самом деле PostgreSQL отрабатывает каждый SQL-оператор как транзакцию. Если вы не вставите команду BEGIN, то каждый отдельный оператор будет неявно окружён командами BEGIN и COMMIT Если последовательно выполняемые в сеансе работы с базой данных операторы логически не связаны и каждый из них не нарушает целостности, каждый оператор выделяется в отдельную транзакцию Проблема параллельных транзакций • • В многопользовательском режиме возможны ситуации, когда одновременно поступает запрос к одной и той же таблице - при этом могут возникать конфликтные ситуации Пример конфликтной ситуации: SELECT AVG(Rating) FROM Suppliers • • • • 131 UPDATE Suppliers SET Rating = Rating*2 Для управления параллельными транзакциями в SQL используется механизм блокировок (locks) Блокировки накладывают ограничение на выполнение некоторых операций над данными, если в этот момент активны другие операции, при этом блокируемые операции выстраиваются в очередь Виды блокировок: S- locks – разделяемые блокировки: в единицу времени может выполняться несколькими пользователями X- locks – исключительные блокировки: запрещается доступ к данным всем пользователям, кроме того, чья блокировка в данный момент активна Уровень изолированности транзакций определяет, в какой мере в результате выполнения логически параллельных транзакций допускается получение несогласованных данных. • • • • • • • Шкала уровней изолированности транзакций: более высокий уровень 132 изолированности - лучшая согласованность данных, возможное снижение количества физически параллельно выполняемых транзакций. Более низкий уровень - позволяет выполнять больше параллельных транзакций, но снижает точность данных. На практике необходим компромисс между скоростью работы и гарантированной согласованностью получаемых данных. 4 стандартных уровня изоляции Read uncommited (чтение незафиксированных данных) – Можно увидеть изменения незавершенных транзакций Read commited (чтение фиксированных данных) – Можно увидеть изменения только завершенных транзакций Repeatable read (повторяющееся чтение) – То, что прочитано однажды, будет прочитано еще раз Serializable (упорядочиваемость) – Полная иллюзия последовательного выполнения, в частности, отсутствие неожиданно появляющихся строк Уровень изоляции Фантомное чтение Неповторяющееся чтение «Грязное» чтение Потерянное обновление READ UNCOMMITTED - - - + READ COMMITTED - - + + REPEATABLE READ - + + + SERIALIZABLE + + + +