Вы когда-нибудь задумывались, сколько силы может заключаться в нескольких словах? В мире баз данных есть одна фраза, от которой у опытных разработчиков холодеет кровь. Всего два слова: DELETE FROM. А когда к ним добавляется название таблицы без волшебного условия WHERE, это превращается в цифровой эквивалент нажатия красной кнопки с надписью «Ничего не трогать!».

Почему это так страшно? Представьте себе библиотеку с тысячами томов. Вы — библиотекарь, и вам нужно убрать все книги, изданные до 1990 года. Вы составляете аккуратный список, методично проходите по полкам, отбираете нужные экземпляры. Это — DELETE FROM books WHERE year < 1990. А теперь представьте, что вместо этого вы подходите к первому стеллажу и просто смахиваете на пол все книги подряд. Все. Без разбора. Современные романы, редкие антикварные издания, новые поступления — всё летит в одну кучу. Это и есть тот самый запрос без WHERE.

В цифровом мире последствия ещё масштабнее. Таблица users — это обычно сердце любого продукта. Это не просто логины и пароли. Это история заказов, персональные настройки, подписки, платежные данные, годы накопленной статистики. И всё это может исчезнуть в миллисекунды. Буквально. Один неверный запрос — и вместо выборочного удаления тестового аккаунта вы получаете идеально чистую, пустую таблицу. Тишина. Digital-мёртвая тишина.

Как это происходит в реальной жизни? Сценариев множество, и все они банальны до ужаса. Разработчик устал после долгого дня, его глаза слипаются, а завтра — сдача проекта. Он подключился к базе, чтобы почистить мусорные данные. В соседнем окне — локальная база для тестов. В другом — продовая. Небольшая невнимательность, быстрое переключение между вкладками, и... запрос улетает не туда.

Или другой частый случай: новичок в команде. Ему дают задание — удалить неактивных пользователей. Он открывает документацию, гуглит синтаксис SQL, находит пример: DELETE FROM таблица WHERE условие. Но в спешке, в попытках быстрее разобраться, он сначала пробует простой запрос, чтобы «посмотреть, как работает». Только забывает дописать ту самую важную часть с WHERE. А ещё хуже — копирует рабочий запрос, редактирует его, и в процессе случайно стирает условие, оставляя роковую конструкцию.

Бывает и чисто техническая ошибка. Скрипт для очистки данных, который должен был выполняться с параметром --where="id=123", запускается без этого параметра. Или в ORM (системе для работы с базой через код) неправильно строится запрос, и вместо User.delete(where: { inactive: true }) выполняется User.delete_all().

История из первых уст Алексей, тимлид с восьмилетним стажем, до сих пор с содроганием вспоминает один случай из своей практики. «Это был четверг, около шести вечера. Мы готовились к большому обновлению. Один из джунов работал над скриптом миграции данных. В теории всё было просто — перенести старые логи в архивную таблицу и удалить их из основной. Мы всё проверили, но...»

«Но в коде была опечатка. Вместо того чтобы удалять данные FROM temp_logs WHERE archived=true, скрипт пытался удалить их FROM transaction_logs. А условия WHERE не было вообще. Сработала защита на уровне базы — каскадное удаление. За логами потянулись связанные записи. За три секунды мы потеряли 40% данных о ....

Подробнее в ВКонтакте.

Telegram | ВКонтакте


В этом посте были ссылки, но мы их удалили по правилам Сетки

Вы когда-нибудь задумывались, сколько силы может заключаться в нескольких словах? В мире баз данных есть одна фраза, от которой у опытных разработчиков холодеет кровь. Всего два слова: DELETE FROM | Сетка — социальная сеть от hh.ru