
- •Часть IV
- •Глава 13 Восстановление
- •13.1. Введение
- •13.2. Транзакции
- •13.3. Восстановление транзакции
- •13.4. Восстановление системы
- •13.5. Восстановление носителей
- •13.6. Двухфазная фиксация
- •13.7. Поддержка языка sql
- •13.8. Резюме
- •Глава 14 Параллелизм
- •14.1. Введение
- •14.2. Три проблемы параллелизма
- •14.3. Блокировка
- •14.4. Решение проблем параллелизма
- •14.5. Тупиковая ситуация
- •14.6. Способность к упорядочению
- •14.7. Уровни изоляции
- •14.8. Преднамеренная блокировка
- •IX s
- •14.9. Поддержка блокировок в sql
- •14.10. Резюме
- •14.13. Papadimitriou с. The Theory of Database Concurrency Control.— Rockville, Md.: Computer Science Press, 1986.
- •Глава 15 Безопасность
- •15.1. Введение
- •15.2. Общие соображения
- •15.3. Избирательное управление доступом
- •15.4. Модификация запроса
- •15.5. Обязательное управление доступом
- •15.6. Шифрование данных
- •Стандарт шифрования данных
- •15.7. Поддержка мер обеспечения безопасности в языке sql
- •15.8. Резюме
15.4. Модификация запроса
Для иллюстрации некоторых представленных выше идей следует описать аспекты безопасности, реализованные с помощью достаточно интересного подхода [15.16] в системе INGRES на основе языка QUEL. В общем, любой запрос на языке QUEL перед исполнением автоматически модифицируется таким образом, чтобы не смог нарушить ни одного правила безопасности. В качестве примера предположим, что пользователю U разрешено извлекать данные только о товарах, размещенных в Лондоне, с помощью следующего правила:
DEFINE PERMIT RETRIEVE ON Р ТО U
WHERE P.CITY = "London"
(Оператор DEFINE PERMIT будет подробно описан ниже.) Теперь предположим, что пользователь U задает приведенный ниже запрос на языке QUEL:
RETRIEVE ( Р.Р#, Р.WEIGHT )
WHERE P. COLOR = "Red"
Используя "разрешение" (директива PERMIT) на извлечение комбинации отношения Р и пользователя U в том виде, в каком они сохраняются в каталоге, в системе INGRES приведенный выше запрос автоматически модифицируется следующим образом:
RETRIEVE ( Р.Р#, .WEIGHT ) WHERE P.COLOR = "Red"
AND P.CITY = "London"
Конечно, этот модифицированный запрос вряд ли сможет нарушить заданное правило безопасности. Обратите внимание, что процесс модификации прошел достаточно "незаметно", т.е. пользователь U не был проинформирован о том, что система фактически выполнила запрос, который несколько отличается от исходного. Дело в том, что сокрытие такой информации может быть намеренным (например, пользователю U не следует знать о том, что существуют некоторые товары, не хранящиеся в Лондоне).
Описанный в краткой форме процесс "модификации запроса" полностью идентичен методу, используемому для воплощения представлений. Таким образом, данную методику достаточно просто воплотить в основном благодаря тому, что необходимый для этого код уже присутствует в системе. Другое ее преимущество — сравнительно высокая эффективность, так как появление накладных расходов (по крайней мере, некоторой их части), связанных с обеспечением мер безопасности, происходит во время компиляции, а не во время выполнения программы (здесь предполагается, что система является компилируемой). Еще одно преимущество этой методики состоит в том, что при работе с ней не возникает никаких неудобств, присущих подходу на основе языка SQL, когда для данного пользователя следует задать разные привилегии при обращении к разным частям данных одного и того же отношения (об этом речь будет идти ниже в этой главе).
Недостаток этой методики заключается в том, что не всем правилам безопасности можно придать такую простую форму. В качестве простейшего обратного примера. Предположим, что пользователюUне разрешен допуск к отношению Р. Тогда никакая простая "модифицированная" форма приведенного выше правила извлечения не будет избавлена от иллюзии, что отношения Р не существует. Наоборот, обязательно появится сообщение об ошибке приблизительно следующего содержания: "Вам не разрешен доступ к данному отношению".
В общем виде правила безопасности на языке QUEL формулируются с помощью синтаксиса на основе директивы DEFINE PERMIT:
DEFINE PERMIT список_операторов_через_запятую
ON отношение [ (список_ атрибутов_ через_ запятую) ]
ТО пользователь
[ AT терминалы ]
[ FROM время ТО время]
[ ON день ТО день ]
[ WHERE условие ]
Таким образом, правило DEFINE PERMIT очень похоже на правило CREATE SECURITY RULE за исключением того, что вместо простого использования условий в директиве WHERE для контекстно-зависимого управления (например, для времени и даты) добавлены особые синтаксические директивы. Ниже приводится пример правила, построенного согласно заданному синтаксису:
DEFINE PERMIT APPEND, RETRIEVE, REPLACE
ON S ( SNAME, CITY)
TO Joe
AT TTA4
FROM 9:00 TO 17:30
ON Sat TO Sun
WHERE S. STATUS < 50
AND S.S# = SP.P#
AND SP.P# = P.P#
AND P. COLOR = "Red"
Операторы добавления APPEND и замены REPLACE аналогичны директивам вставки INSERT и обновления UPDATE соответственно.
Правила безопасности сохраняются в каталоге системы INGRES под числовыми идентификаторами (например, 0, 1, 2 и т.д.). Эти идентификаторы можно обнаружить с помощью запроса к каталогу (для получения помощи предусмотрена специальная справочная команда HELP, хотя вместо нее может также использоваться обычный оператор извлечения RETRIEVE языка QUEL). Для устранения приведенного выше правила необходимо также прежде всего указать соответствующий идентификатор. Например, для идентификатора 27 это правило безопасности может быть устранено с помощью следующего утверждения:
DESTROY PERMIT S 27