Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Безопасность систем баз данных. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
905 Кб
Скачать

Рис. 8.8. Поиск старшего преступника

Получили 3 преступников входящих в солнцевскую преступную группировку, возраст которых больше, чем возраст всех преступников из матвеевской преступной группировки. Ключевое слово ANY возвращает значения, соответствующие хотя бы одному условию (булево OR), ключевое слово ALL возвращает значения в том случае, если выполняются все условия(булево

AND).

С ключевым словом ALL связано несколько тонкостей.

Если оно ложно для какого-нибудь из значений, то оно ложно вообще. Предположим, таблица а содержит строку со значением 14, а таблица b — значения 16, 1 и NULL. Если проверить, является ли значение в таблицеа большим, чем все значения в таблице b, то получим false, поскольку 14 не больше 16. То, что другими значениями являются 1 и NULL, роли не играет.

Когда оно не является ложным для любого значения, то не будет истинным, если не является таковым для всех значений. Предположим, что таблица а снова содержит значение 14, а таблица b — 1 и NULL. Проверяя, является ли значение в таблицеа большим, чем ВСЕ значения в таблицеb, вы получите ответ UNKNOWN (ни истина, ни ложь), поскольку невозможно определить, является ли значение NULL большим или меньшим, чем 14.

В том случае, когда таблица в подзапросе не содержит значений, результат всегда будет истинным. Таким образом, если таблица а содержит значение 14, а таблица b — пуста, то при проверке значения в таблицеа в качестве такого, что больше ВСЕХ значений в таблице b, получим ответ true.

101

При использовании ключевого слова ALL следует осторожно работать с таблицами, столбцы которых могут содержать значения NULL. В таких случаях имеет смысл запретить значения

NULL.

8.2. Написание подзапросов строк

Впредыдущих примерах подзапрос возвращал отдельное скалярное значение (например, gruppirovka_id) или набор значений из одного столбца (например, все значения prestupnik_пате).

Вэтом вопросе описан еще один тип подзапросов— подзапрос строк, который работает со значениями множества столбцов из множества строк.

Выясним, имеется ли у нас одинаковые преступления, совершенные преступниками из разных преступных группировок (допустим первой и пятой), за которые был получен одинаковый срок наказания. Для получения ответа нужно сравнить названия преступлений и срок. Такой запрос можно без труда написать в виде вложенного запроса (рис. 8.9):

mysql> SELECT prestuplenie_name,

-> prestuplenie_srok FROM prestuplenie

-> WHERE gruppirovka_id=1 AND

-> (prestuplenie_name, prestuplenie_srok) IN -> (SELECT prestuplenie_name, prestuple-

nie_srok

-> FROM prestuplenie

-> WHERE gruppirovka_id=2);

Рис. 8.9. Поиск по одинаковым срокам наказания

Как видите, в этом вложенном запросе применяется другой синтаксис: список из двух имен столбцов, заключенных в скобки, следует после выраженияWHERE, а внутренний запрос возвращает два столбца.

102

Синтаксис строкового подзапроса позволяет построчно сравнивать множество значений. Запись (prestuplenie_name, prestuplenie_srok) означает, что два значения в строке сравниваются с выходными данными подзапроса. В этом случае подза-

прос возвращает два значения: prestuplenie_name и prestuplenie_srok, но для другой преступной группировки. Таким образом, фрагмент

-> (prestuplenie_name, prestuplenie_srok) IN -> (SELECT prestuplenie_name, prestuple-

nie_srok FROM prestuplenie

-> WHERE gruppirovka_id=2);

сравнивает названия преступлений и срок наказания для - пре ступников входящих в разные преступные группировки, возвращая значение true в случае соответствия. При нахождении соответствующей пары общий запрос выводит результат. Это типичный строковый подзапрос – он выполняет поиск строк, которые существуют в обеих таблицах.

Строковые подзапросы требуют соответствия количества, очередности и типа значений в сопоставляемых столбцах.

8. 3. Вложенные запросы в ключевом слове FROM

Все представленные технологии используют вложенные запросы в выражении WHERE. Теперь опишем, как их альтернативно применить в ключевом слове FROM. Это удобно в тех случаях, когда требуется манипулировать источником данных, используемым в запросе. В этом случае подзапрос формирует таблицу, по которой будет работать внешний запрос. Часто это бывает единственный способ написания запроса.

Предположим нам необходимо подсчитать среднее количество преступлений совершенных преступниками(рис. 8.10). Для написания этого запроса необходимо в подзапросе создать таблицу, выводящую количество совершенных преступлений, а во внешнем запросе применить функцию AVG():

mysql> SELECT AVG(kol_vo) AS sred_kol_vo_prest -> FROM (SELECT prestupnik_name, COUNT(*)

-> AS kol_vo FROM prestupnik

103

-> INNER JOIN prestuplenie

-> USING(prestupnik_id, gruppirovka_id)

-> GROUP BY prestupnik_name) AS podzapros;

Рис. 8.10. Подсчет среднего количества преступлений

Рассмотрим выражение после ключевого словаFROM. Подзапрос использует таблицу, полученную в результате объединения таблиц prestupnik и prestuplenie. Используя технологию группировки, в подзапросе подсчитывается количество совершенных преступлений для каждого преступника(рис. 8.11). Результат подзапроса имеет вид:

mysql> SELECT prestupnik_name, COUNT(*) -> AS kol_vo FROM prestupnik

-> INNER JOIN prestuplenie

-> USING(prestupnik_id, gruppirovka_id)

-> GROUP BY prestupnik_name;

104

Рис. 8.11. Количество преступлений каждого преступника

Столбцу, хранящему количество преступлений, присвоен псевдоним kol_vo. Затем во внешнем запросе с помощью функ-

ции

AVG(kol_vo)

подсчитываем

среднее значение

по

столбцу

kol_vo.

Этот

результат

и

выводится

с

псевдонимо

sred_kol_vo_prest.

 

 

 

 

псевдонимas

 

Для

подзапроса

добавили

табличный

podzapros. При использовании подзапроса в качестве таблицы эта

«производная таблица» должна иметь псевдоним — даже если он

не

участвует в запросе. MySQL не

разрешает пропускать

псевдоним:

mysql> SELECT AVG(kol_vo) AS sred_kol_vo_prest -> FROM (SELECT prestupnik_name, COUNT(*)

-> AS kol_vo FROM prestupnik

-> INNER JOIN prestuplenie

-> USING(prestupnik_id, gruppirovka_id)

-> GROUP BY prestupnik_name);

ERROR 1248 (42000): Every derived table must have its own alias

105

Механизм вложенных запросов в выражении FROM позволяет реализовывать довольно сложные расчеты.

Контрольные вопросы

1.Каково назначение вложенных запросов?

2.В каких выражениях могут использоваться вложенные запросы?

3.Необходимо ли давать псевдоним запросу в выражении

FROM?

4.Может ли использование подзапросов заменить объединение таблиц?

5.Какие типы вложенных запросов вы знаете?

6.Что такое подзапрос строки?

7.В каких случаях следует использовать выражение ANY или

IN?

8.В каких случаях следует использовать выражение ALL?

106

9. РАЗРАБОТКА ПОЛИТИКИ РАЗГРАНИЧЕНИЯ ДОСТУПА

 

 

 

(ПК-36)

 

 

 

 

 

 

9.1. Работа с пользователями в MySQL

 

Просмотреть список всех доступных привилегий можно с

 

помощью

команды SHOW PRIVILEGES монитора MySQL. В

 

приведенной

далее

таблице

перечислены

самые

важные

привилегии. Каждая строка отображает привилегию вместе с

описанием четырех уровней, на которых они могут назначаться.

 

Например,

во второй строке показана привилегияALTER,

 

управляющая применением инструкции ALTER TABLE, вместе с

 

уровнями, на которых ею можно управлять.

 

 

· Глобальный уровень чтобы

присвоить

пользователю

отдельную

 

привилегию

для

всех

баз данных на ,

сервере

используйте в инструкции GRANT выражение ON *. *.

·Уровень базы данных для выдачи привилегий в одной или нескольких базах данных можно использовать, к примеру,

запись prestupnost.*.

·Уровень таблиц – для назначения привилегии в одной или нескольких таблицах базы данных можно использовать запись prestupnost.gruppirovka.

·Уровень столбцов – подтверждение доступа к одному или нескольким столбцам таблицы базы данных(недоступно для ALTER). Доступ на уровне столбцов подтверждается

использованием

заключенного

в

скобки

списка

столбцов,

разделенных запятыми, следующего после привилегии.

 

В

табл.

9.1 показаны

уровни,

на

которых

можно

конфигурировать привилегии Global (G), Database (D), Table (T)

и Column

(С).

Например, в

первой

строке показано, что

привилегия ALL доступна на всех уровнях за исключением столбцов.

107

Таблица 9.1

Привилегии и их уровни в MySQL

Привилегия

Приложение

G

D

Т

С

1

2

3

4

5

6

 

 

 

 

 

 

ALL

Все простые привилегии за исключением воз-

 

 

 

X

можности подтверждать привилегии

 

 

 

 

(GRANTOPTION)

 

 

 

 

ALTER

Инструкция A LTER TABLE

 

 

 

X

 

 

 

 

 

 

CREATE

Инструкция CREATE

 

 

 

X

CREATE

Инструкция CREATE TEMPORARY TABLES.

 

 

 

 

Пользователю разрешено создавать временные

 

 

X

X

TEMPORARY

 

 

TABLES

таблицы в активной базе данных для собствен-

 

 

 

 

ных сеансов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DELETE

Инструкция DELETE

 

 

 

X

DROP

Инструкция DROP

 

 

 

X

 

 

 

 

 

 

EXECUTE

Хранимые процедуры (только начиная с версии

 

X

X

X

 

MySQL 5)

 

 

 

 

 

 

 

 

 

 

FILE

Чтение и запись файлов на диск с помощью

 

X

X

X

SELECT... INTO и LOAD DATA INFILE

 

 

 

 

 

 

 

 

 

 

 

 

Возможность подтверждать собственные при-

 

 

 

 

GRANT

вилегии для других. Для большинства прило-

 

 

 

 

жений такой необходимости не возникает, так

 

 

 

X

OPTION

как привилегии доступа управляются пользова-

 

 

 

 

 

 

 

 

 

 

телем root

 

 

 

 

 

 

 

 

 

 

INDEX

Инструкции CREATE INDEX и DROP INDEX

 

 

 

X

INSERT

Инструкция INSERT

 

 

 

 

 

 

 

 

 

 

 

Инструкции LOCK TABLES и UNLOCK

 

 

 

 

 

TABLES. Требуется привилегия SELECT для

 

 

 

 

LOCK TABLES

таблиц. Поскольку это привилегия уровня базы

 

 

X

X

 

данных, она может подтверждаться только с

 

 

 

 

 

использованием формата имя базы данных. *

 

 

 

 

 

(или *. *)

 

 

 

 

PROCESS

SHOW FULL PROCESSLIST

 

X

X

X

 

 

 

 

 

 

108

Окончание табл. 9.1

1

2

3

4

5

6

 

 

 

 

 

 

REPLICATION

Управляет возможностью подчиненного серве-

 

 

 

 

ра считывать двоичный журнал регистрации

 

X

X

X

SLAVE

главного сервера

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SELECT

Инструкция SELECT, позволяющая считывать

 

 

 

 

 

данные из указанных таблиц

 

 

 

 

SHOW

Управляет отображением всех баз данных с ис-

 

X

X

X

DATABASES

пользованием инструкции SHOW DATABASES

 

 

 

 

 

 

 

 

 

 

SHUTDOWN

Управляет выключением сервера с помощью

 

X

X

X

команды mysqladmin shutdown

 

 

 

 

 

 

 

 

 

 

 

 

Инструкции CHANGE, MASTER, KILL, PURGE

 

 

 

 

SUPER

MASTER LOGS, SET GLOBAL и команда

 

X

X

X

 

mysqladmin debug

 

 

 

 

UPDATE

Инструкция UPDATE для модификации суще-

 

 

 

 

 

ствующих данных в указанных таблицах

 

 

 

 

 

Никаких привилегий. Явным образом запреща-

 

 

 

 

USAGE

ет выполнять любые операции, кроме подклю-

 

 

 

 

 

чения к серверу. Используется при создании

 

 

 

 

 

учетной записи или обновлении деталей

 

 

 

 

 

 

 

 

 

 

В табл. 9.1 показано значение опцииALL на глобальном уровне, а также на уровнях баз данных и таблиц. Например, во втором столбце показано, что происходит в результате назначении для пользователя GRANT ALL ON *.*. Все привилегии, помеченные галочками ( ), предоставляются пользователю, а привилегии, отмеченные крестиком (Х), пропускаются. Команда GRANT OPTION, позволяющая пользователю передать свои привилегии еще одному пользователю, недоступна для привилегий ALL на всех уровнях и должна задаваться явным образом (табл. 9.2).

109

 

 

Простые привилегии ALL

 

Таблица 9.2

 

 

 

 

 

 

Привилегия

 

Глобальный уровень

База данных

Таблица

 

 

 

 

 

 

 

 

 

 

 

ALTER

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CREATE

 

 

 

 

 

 

 

X

 

CREATE TEMPORARY

 

 

 

 

 

 

X

 

TABLES

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DELETE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DROP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

EXECUTE

 

 

 

 

X

 

 

X

 

FILE

 

 

 

 

X

 

 

X

 

GRANT OPTION

 

 

X

 

X

 

 

X

 

INDEX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INSERT

 

 

 

 

 

 

 

 

 

LOCK TABLES

 

 

 

 

 

 

 

X

 

PROCESS

 

 

 

 

X

 

 

X

 

RELOAD

 

 

 

 

X

 

 

X

 

REPLICATION CLIENT

 

 

 

X

 

 

X

 

REPLICATION SLAVE

 

 

 

X

 

 

X

 

SELECT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SHOW DATABASES

 

 

 

X

 

 

X

 

SHUTDOWN

 

 

 

 

X

 

 

X

 

SUPER

 

 

 

 

X

 

 

X

 

UPDATE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Привилегия GRANT OPTION

позволяет

пользователю

передавать

любые

 

свои

права

другим

пользователям.

Рассмотрим пример, где подключимся к монитору как пользователь root:

mysql> GRANT ALL ON prestupnost.* TO ‘prepodavatel’@’localhost’ IDENTIFIED BY ‘the_password’;

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT GRANT OPTION ON prestupnost.* TO ‘prepodavatel’@’localhost’ IDENTIFIED BY

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]