Перед началом
Используйте отдельную базу для разработки и проверяйте схему текущей установки. Данные пользователя не должны становиться частью SQL-строки.
Порядок действий
- Получите QueryBuilder через
App::query()или доступный сервис action. Передавайте значения через параметры методов. - Пропускайте динамические имена таблиц, колонок и направления сортировки через whitelist. SQL-выражения используйте только в явных Raw-методах.
- Перед update обязательно задайте условие. Для намеренного обновления всей таблицы используйте явный
updateAll(). - Связанные изменения нескольких таблиц объединяйте транзакцией. Для инфоблоков используйте IblockService, чтобы сохранить поля, категории и lifecycle.
- Изменения схемы оформляйте миграцией с read-only preflight и синхронизируйте установочную схему. Конфликт должен блокировать batch до первого DDL.
- Проверьте повторный запуск миграции, компенсацию неудачной попытки и работу с native prepared statements.
Обратите внимание. Автоматическая компенсация использует
rollbackFailedUp(), а не обычный down. Она не должна удалять объекты, существовавшие до неудачного запуска.Проверьте результат
Пользовательские значения параметризованы, связанные записи согласованы, миграция повторяется безопасно и не теряет существующую схему.