- прямо в командному рядку після ключа -p (без пробілу, дуже небезпечно)
- вказавши ключ -p без пароля (програма запросить пароль з клавіатури, найбезпечніше)
- в файлі .my.cnf (права до цього файлу повинні бути тільки у власника), секція [client], поля host, user і password
- за допомогою змінної оточення MYSQL_PWD (дуже небезпечно) і MYSQL_HOST
Вся інформація про права зберігається в БД з ім'ям mysql. Ніхто не повинен мати до неї доступу на читання (див. Про паролі).
Перевірка прав при виконанні кожного запиту: таблиця db сортується по полях Host, Db і User, таблиця host по полях Host і Db, таблиці tables_priv і columns_priv по полях Host, Db і User від найбільш специфічного до найменш. Для адміністративних запитів і доступу до файлів перевіряється тільки таблиця user. Для інших запитів на початку перевіряється таблиця user - а чи немає у даного користувача прав доступу на "глобальному" рівні. Якщо є - операція дозволяється. Якщо немає, то перевіряються права доступу до конкретної БД з конкретного хоста (по перетинанню таблиць Db і Host з урахуванням шаблонів і порожніх полів). Якщо їх достатньо, то доступ дається. Якщо недостатньо, то до об'єднання "глобальних" прав і прав БД / хост додаються права, витягнуті з таблиць tables_priv і columns_priv. Якщо і цього не вистачає, то на жаль.
Права доступу читаються mysqld (і не читаються при "ручному" зміні БД mysql):- при запуску
- при виконанні команд GRANT, REVOKE і SET PASSWORD
- при виконанні команди FLUSH PRIVILEGES
- при виконанні mysqladmin flush-privileges / reload
"Глобальні" привілеї і зміни пароля набувають чинності тільки при наступному з'єднанні. Зміни в доступі до БД - при наступній команді use. Зміни в доступі до таблиць і колонок - при наступному запиті.
Зміна пароля: set password for ім'я = password ( 'новий пароль').
GRANT тип-привілеї [(список-стовпців)] [, тип-привілеї [(список-стовпців)]. ] ON <имя-таблицы | * | *.* | имя-БД.*> TO ім'я-користувача [IDENTIFIED BY 'пароль'] [, ім'я-користувача [IDENTIFIED BY 'пароль]. ] WITH GRANT OPTION
REVOKE тип-привілеї [(список-стовпців)] [, тип-привілеї [(список-стовпців)]. ] ON <имя-таблицы | * | *.* | имя-БД.*> FROM ім'я-користувача [, ім'я-користувача. ]
Типи привілеїв:- ALL PRIVILEGES (aka ALL)
- ALTER
- CREATE
- DELETE
- DROP
- FILE
- GRANT OPTION (тільки для REVOKE)
- INDEX
- INSERT
- PROCESS
- REFERENCES (не реалізоване)
- RELOAD
- SELECT
- SHUTDOWN
- UPDATE
- USAGE (ніяких - просто місце застовпити)
Для стовпців можна задавати тільки INSERT, SELECT і UPDATE. Для таблиць - INSERT, SELECT, UPDATE, CREATE, DROP, DELETE, GRANT, INDEX, ALTER. Використання "*. *" Означає завдання глобальних привілеїв. Використання "*" означає завдання привілеїв для поточної БД (якщо поточної БД немає, то глобальні).
SHOW GRANTS FOR ім'я @ хост;
Якщо привілеї на рівні таблиць і колонок використовуються хоча б для одного користувача, то перевірки робляться для всіх запитів всіх користувачів, що дуже сильно уповільнює роботу.