Раньше ensureClientSchemaStateTable запускался на каждом цикле синка
(каждые 5 минут) и пытался ALTER TABLE, даже если все колонки уже были.
Для пользователей без DDL-прав это давало WARN-спам в каждом цикле.
Два изменения:
- schemaOnce (sync.Once) на Service: ensureClientSchemaStateTable
вызывается не более одного раза за жизнь процесса
- columnExists() проверяет information_schema.COLUMNS перед каждым
ALTER — если колонка уже есть, ALTER пропускается без ошибки
Если таблица уже мигрирована сервером, клиент молча пропускает все DDL.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>