Безопасность систем баз данных. Учебное пособие
.pdf
Рис. 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
