diff --git a/README.md b/README.md index a40c386..6f2562f 100644 --- a/README.md +++ b/README.md @@ -105,58 +105,85 @@ go run ./cmd/migrate_ops_projects -apply go run ./cmd/migrate_ops_projects -apply -yes ``` -### Минимальные права БД для пользователя квотаций +### Права БД для пользователя приложения -Если нужен пользователь, который может работать с конфигурациями, но не может создавать/удалять прайслисты: +#### Полный набор прав для обычного пользователя + +Чтобы выдать существующему пользователю все необходимые права (без переоздания): ```sql --- 1) Создать пользователя (если его ещё нет) -CREATE USER IF NOT EXISTS 'quote_user'@'%' IDENTIFIED BY ''; +-- Справочные таблицы (только чтение) +GRANT SELECT ON RFQ_LOG.lot TO ''@'%'; +GRANT SELECT ON RFQ_LOG.qt_lot_metadata TO ''@'%'; +GRANT SELECT ON RFQ_LOG.qt_categories TO ''@'%'; +GRANT SELECT ON RFQ_LOG.qt_pricelists TO ''@'%'; +GRANT SELECT ON RFQ_LOG.qt_pricelist_items TO ''@'%'; --- 2) Если пользователь уже существовал, принудительно обновить пароль -ALTER USER 'quote_user'@'%' IDENTIFIED BY ''; +-- Таблицы конфигураций и проектов (чтение и запись) +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_configurations TO ''@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_projects TO ''@'%'; --- 3) (Опционально, но рекомендуется) удалить дубли пользователя с другими host, --- чтобы не возникало конфликтов вида user@localhost vs user@'%' -DROP USER IF EXISTS 'quote_user'@'localhost'; -DROP USER IF EXISTS 'quote_user'@'127.0.0.1'; -DROP USER IF EXISTS 'quote_user'@'::1'; - --- 4) Сбросить лишние права -REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'quote_user'@'%'; - --- 5) Чтение данных для конфигуратора и синка -GRANT SELECT ON RFQ_LOG.lot TO 'quote_user'@'%'; -GRANT SELECT ON RFQ_LOG.qt_lot_metadata TO 'quote_user'@'%'; -GRANT SELECT ON RFQ_LOG.qt_categories TO 'quote_user'@'%'; -GRANT SELECT ON RFQ_LOG.qt_pricelists TO 'quote_user'@'%'; -GRANT SELECT ON RFQ_LOG.qt_pricelist_items TO 'quote_user'@'%'; - --- 6) Работа с конфигурациями -GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_configurations TO 'quote_user'@'%'; +-- Таблицы синхронизации (только чтение для миграций, чтение+запись для статуса) +GRANT SELECT ON RFQ_LOG.qt_client_local_migrations TO ''@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_client_schema_state TO ''@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_pricelist_sync_status TO ''@'%'; +-- Применить изменения FLUSH PRIVILEGES; -SHOW GRANTS FOR 'quote_user'@'%'; -SHOW CREATE USER 'quote_user'@'%'; +-- Проверка выданных прав +SHOW GRANTS FOR ''@'%'; ``` -Полный набор прав для пользователя квотаций: +#### Таблицы и их назначение + +| Таблица | Назначение | Права | Примечание | +|---------|-----------|-------|-----------| +| `lot` | Справочник компонентов | SELECT | Существующая таблица | +| `qt_lot_metadata` | Расширенные данные компонентов | SELECT | Метаданные компонентов | +| `qt_categories` | Категории компонентов | SELECT | Справочник | +| `qt_pricelists` | Прайслисты | SELECT | Управляется сервером | +| `qt_pricelist_items` | Позиции прайслистов | SELECT | Управляется сервером | +| `qt_configurations` | Сохранённые конфигурации | SELECT, INSERT, UPDATE | Основная таблица работы | +| `qt_projects` | Проекты | SELECT, INSERT, UPDATE | Для группировки конфигураций | +| `qt_client_local_migrations` | Справочник миграций БД | SELECT | Только чтение (управляется админом) | +| `qt_client_schema_state` | Состояние локальной схемы | SELECT, INSERT, UPDATE | Отслеживание примененных миграций | +| `qt_pricelist_sync_status` | Статус синхронизации | SELECT, INSERT, UPDATE | Отслеживание активности синхронизации | + +#### При создании нового пользователя + +Если нужно создать нового пользователя с нуля: ```sql -GRANT USAGE ON *.* TO 'quote_user'@'%' IDENTIFIED BY ''; +-- 1) Создать пользователя +CREATE USER IF NOT EXISTS 'quote_user'@'%' IDENTIFIED BY ''; + +-- 2) Выдать все необходимые права GRANT SELECT ON RFQ_LOG.lot TO 'quote_user'@'%'; GRANT SELECT ON RFQ_LOG.qt_lot_metadata TO 'quote_user'@'%'; GRANT SELECT ON RFQ_LOG.qt_categories TO 'quote_user'@'%'; GRANT SELECT ON RFQ_LOG.qt_pricelists TO 'quote_user'@'%'; GRANT SELECT ON RFQ_LOG.qt_pricelist_items TO 'quote_user'@'%'; GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_configurations TO 'quote_user'@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_projects TO 'quote_user'@'%'; +GRANT SELECT ON RFQ_LOG.qt_client_local_migrations TO 'quote_user'@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_client_schema_state TO 'quote_user'@'%'; +GRANT SELECT, INSERT, UPDATE ON RFQ_LOG.qt_pricelist_sync_status TO 'quote_user'@'%'; + +-- 3) Применить изменения +FLUSH PRIVILEGES; + +-- 4) Проверить права +SHOW GRANTS FOR 'quote_user'@'%'; ``` -Важно: -- не выдавайте `INSERT/UPDATE/DELETE` на `qt_pricelists` и `qt_pricelist_items`, если пользователь не должен управлять прайслистами; -- если видите ошибку `Access denied for user ...@''`, проверьте, что не осталось других записей `quote_user@host` кроме `quote_user@'%'`; -- после смены DB-настроек через `/setup` приложение перезапускается автоматически и подхватывает нового пользователя. +#### Важные замечания + +- **Таблицы синхронизации** должны быть созданы администратором БД один раз. Приложение не требует прав CREATE TABLE. +- **Прайслисты** (`qt_pricelists`, `qt_pricelist_items`) — справочные таблицы, управляются сервером, пользователь имеет только SELECT. +- **Конфигурации и проекты** — таблицы, в которые пишет само приложение (INSERT, UPDATE при сохранении изменений). +- **Таблицы миграций** нужны для синхронизации: приложение читает список миграций и отчитывается о применённых. +- Если видите ошибку `Access denied for user ...@''`, проверьте наличие конфликтующих записей пользователя с разными хостами (user@localhost vs user@'%'). ### 4. Импорт метаданных компонентов