Каждый случайно забыл предложение WHERE
в запросе DELETE
и один или два раза обработал некоторые данные без резервного копирования. Я размышлял над этой проблемой, и мне было интересно, является ли решение, которое я нашел, практичным.
Что, если вместо реальных DELETE
запросов сценарии приложения и обслуживания выполняли что-то вроде:
UPDATE foo SET to_be_deleted=1 WHERE blah = 50;
А потом задание cron было выполнено и фактически удалено все с флагом? Недостатком было бы то, что почти к каждому другому запросу нужно было бы добавить WHERE to_be_deleted != 1
, но с другой стороны, вы никогда больше не ошибочно потеряете данные. Вы могли видеть «затронуто 2 349 325 строк» и сказать: «Хм, похоже, я забыл предложение WHERE
» и сбросить флаги. Вы даже можете сделать поле to_be_deleted столбцом DATE
, чтобы задание cron проверило, пришло ли время строки.
Кроме того, вы можете удалить разрешение DELETE
у пользователя рабочей базы данных, поэтому даже если кому-то удастся внедрить какой-то SQL на ваш сайт, он не сможет ничего удалить.
Итак, мой вопрос: это хорошая идея или есть подводные камни, которых я не вижу?