Привилегии и права доступа: GRANT и REVOKE
🤝 Введение в привилегии: почему это важно?
Базы данных — как многоэтажные дома. Без правил доступа любой может зайти в вашу квартиру и переставить мебель! GRANT и REVOKE — это «замки» для ваших SQL-данных.
Пример проблемы:
-- Уборщик случайно удалил таблицу с клиентами
DELETE FROM customers; -- Ой!
🗝️ Основные привилегии: мини-словарь
| Привилегия | Что разрешает? |
|---|---|
SELECT |
Чтение данных |
INSERT |
Добавление записей |
UPDATE |
Изменение данных |
DELETE |
Удаление данных |
ALL PRIVILEGES |
Полный доступ (администратор) |
🔓 GRANT: выдача прав
Синтаксис-пазл:
GRANT привилегия1, привилегия2
ON объект
TO пользователь;
Живые примеры
1. Даём доступ к чтению:
GRANT SELECT
ON employees
TO accountant; -- Бухгалтеру можно только смотреть
2. Права на несколько действий:
GRANT SELECT, INSERT, UPDATE
ON orders
TO manager; -- Менеджер может работать с заказами
3. Суперспособности для админа:
GRANT ALL PRIVILEGES
ON *.*
TO db_admin; -- Полный контроль над всеми БД
🔒 REVOKE: отзыв прав
Работает зеркально GRANT:
REVOKE привилегия
ON объект
FROM пользователь;
Пример «разжалования»:
REVOKE DELETE
ON products
FROM intern; -- Стажёр больше не сможет удалять товары
🎯 Гранты с условиями: WITH GRANT OPTION
Хитрый флаг, который позволяет пользователю передавать свои права другим:
GRANT SELECT
ON reports
TO team_lead
WITH GRANT OPTION; -- Теперь team_lead может давать SELECT другим
⚠️ Опасность: цепочка прав может выйти из-под контроля!
🧩 Комбинированные сценарии
1. Создание ролей (для групп пользователей):
CREATE ROLE marketing;
GRANT SELECT ON campaigns TO marketing;
GRANT marketing TO user1, user2; -- Назначение роли
2. Каскадный отзыв:
REVOKE GRANT OPTION FOR SELECT
ON database.table
FROM user3
CASCADE; -- Отзывает и все производные права
💡 Проверка прав: кто на что имеет доступ?
Полезные системные таблицы:
-- Для MySQL
SHOW GRANTS FOR current_user;
-- Для PostgreSQL
\du
🚨 Типичные ошибки
1. Избыточные права: Не давайте ALL PRIVILEGES без необходимости.
-- Плохо:
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%';
-- Лучше:
GRANT SELECT, INSERT ON dev_db.* TO 'dev'@'%';
2. Забытый REVOKE: Увольняете сотрудника? Отзывайте права!
REVOKE ALL PRIVILEGES ON *.* FROM 'ex_employee'@'%';
🏆 Лучшие практики
- Принцип минимальных прав: Выдавайте только то, что действительно нужно.
- Роли > Индивидуальные права: Управлять 10 ролями проще, чем 100 пользователями.
- Аудит: Раз в квартал проверяйте
SHOW GRANTS.
📚 Где потренироваться?
- Создайте тестовую БД и пользователей
- Поиграйте с комбинациями GRANT/REVOKE
- Попробуйте «сломать» доступ, чтобы понять ограничения
-- Пример для тренировки
CREATE USER trainee IDENTIFIED BY 'password';
GRANT SELECT ON sakila.* TO trainee;
REVOKE SELECT ON sakila.actor FROM trainee;