Можно ли обновлять статусы через SQL запрос без использования кода?
Что проверяют
Технически ответ «да» очевиден. Интервьюер хочет понять, видите ли вы, что прямой UPDATE обходит всё, что приложение делает при смене статуса. Следом спрашивают: «Как бы вы сделали это на проде и как откатили бы ошибку?».
Как отвечать
Начните с «можно, но с оговорками» и перечислите, что теряется:
- бизнес-правила: переходы статусов часто описаны в коде как конечный автомат, например из «Отменён» нельзя вернуться в «Оплачен». SQL про это не знает;
- побочные эффекты: доменные события, запись в outbox, уведомления, аудит, сброс кеша. Если это живёт в сервисах на C#, после ручного запроса база и остальная система разойдутся;
- хранение enum: EF Core по умолчанию пишет enum числом.
SET Status = 'Completed'упадёт или запишет не то, а число надо сверять с актуальным enum, а не с памятью.
Когда ручное обновление оправдано (исправление данных после бага, разовая миграция), покажите безопасный порядок:
- сначала
SELECTс тем жеWHERE, чтобы увидеть, сколько строк затронется; - запрос внутри транзакции:
BEGIN TRAN,UPDATE, проверка@@ROWCOUNT, и только потомCOMMITилиROLLBACK; - большие объёмы пачками, например
UPDATE TOP (1000)в цикле, иначе SQL Server надолго держит блокировки и может эскалировать их до всей таблицы; - скрипт в репозитории, а не в личной консоли: миграция EF Core с
migrationBuilder.Sql(...)или отдельный скрипт через ревью.
Если массовая смена статуса нужна из кода, в EF Core 7 и новее есть ExecuteUpdateAsync: один SQL-запрос без загрузки сущностей. Но он тоже идёт мимо трекера изменений и перехватчиков SaveChanges, так что оговорки выше относятся и к нему.
Где спотыкаются
Отвечают «да, пишем UPDATE» и на этом всё. Без слов про бизнес-логику и побочные эффекты ответ выглядит как у человека, который не разгребал последствия такого запроса.
Забывают про WHERE или проверяют его после выполнения. Правило простое: сначала SELECT, потом тот же фильтр в UPDATE.
Не думают, что приложение в этот момент работает. Пользователь может держать открытую форму со старым статусом и перезаписать ручную правку. Спасает токен конкурентности rowversion, без него правка молча потеряется.