Ошибочные массовые удаления и обновления - ошибка дизайна? - PullRequest
4 голосов
/ 13 февраля 2009

Почему разработчикам SQL не требовалось ключевое слово (например, " All ") для любых обновлений или Delete операторов, которые не имеют Где оговорка? Был ли это просто недосмотр с их стороны? Они бы спасли столько горя (не говоря уже о работе!), Если бы сделали это!

Ответы [ 11 ]

7 голосов
/ 13 февраля 2009

После этой ошибки я неукоснительно набрал привычку набирать


BEGIN TRANSACTION;

-- Select Blah

-- Some Sql here that changes Blah

-- Select Blah

ROLLBACK TRANSACTION;

затем запустив его, убедившись, что количество затронутых строк выглядит вменяемым, еще раз посмотрев на Sql, затем заменив ROLLBACK на COMMIT и запустив его навсегда.

Это займет всего 15 дополнительных секунд и избавит меня от изжоги, особенно при сложных запросах типа UPDATE...FROM.

И действительно, я согласен, должно было быть ключевое слово ALL или что-то подобное, чтобы предотвратить подобные всплески. Или встроенная опция в вашей среде запросов Sql, которая действует как кассовые аппараты, когда у меня будет спазм пальцев и двойной удар по экранам в Taco Bell: «Вы ДЕЙСТВИТЕЛЬНО имели в виду 99 тако?»

4 голосов
/ 13 февраля 2009

Существует так много других действительно простых способов испортить ваши данные SQL, что попытка перехватить любой из них - это просто пустая трата времени. ОБНОВЛЕНИЕ без ГДЕ так же плохо (возможно, хуже). Отсутствие одного или двух предложений в SELECT, объединяющем несколько таблиц, может привести к его печати на консоли вместо одной строки, триллиона.

Работайте с реплицированными рабами, когда это возможно. Если это невозможно, убедитесь, что доступны резервные копии, которые не будут мгновенно повреждены обновлениями. При вводе запросов UPDATE или DELETE медленно и осторожно печатайте и всегда смотрите на него несколько секунд, прежде чем вводить точку с запятой.

2 голосов
/ 13 февраля 2009

Где написано, что вам нужно написать оператор SQL, который может быть выполнен без предложения WHERE? Когда я их набираю, я набираю их не по порядку, чтобы это не было допустимым оператором SQL, пока я не закончу. Другими словами, я набираю предложение WHERE, затем возвращаюсь и заполняю часть DELETE или UPDATE.

И всякий раз, когда я что-то делаю в среде без разработки, я сначала выполняю SELECT, чтобы убедиться, что получаю правильные строки с моим условием WHERE, а затем меняю его на DELETE / UPDATE.

1 голос
/ 13 февраля 2009

Множество ИТ-материалов было (есть) написано пользователем в последнюю очередь, а в первую очередь легкостью разработки. Sql - отличный пример, он работает, но многие (тривиальные) простые вещи сложны. Тем не менее, такие сложные вещи, как удаление всех ваших данных, очень просты. Я вижу это как недостаток дизайна.

1 голос
/ 13 февраля 2009

Я думаю, вы обнаружите, что они предполагали, что вы будете знать, что вы делаете, и проявите хоть немного интеллекта: -).

Я знаю, давай сыграем в "Reductio Ad Absurdum":

  • Вы не должны иметь возможность delete[] в C ++ без ключевого слова ALL. Что если вы просто хотите удалить один элемент массива?
  • Все те итераторы, которые люди, похоже, любят, опасны, не заставляя своих пользователей указывать ВСЕ. Что, если они просто хотели подмножество?
  • Mon Dieu! Что, если люди должны были оставить предложение WHERE вне своего SELECT? Потенциал причинения вреда поистине огромен, для извлечения всех этих данных могут потребоваться часы, связывая ценное соединение с СУБД на время.

Пожалуйста, не обижайтесь, я бы предпочел, чтобы вы воспринимали это в том духе, который задумал (легкий юмор). Я думаю, как профессионалы, мы должны знать, что мы делаем. Конечно, я сделал несколько прекрасных ошибок, таких как добавление файла passwd с помощью:

echo "....." >/etc/passwd

вместо использования ">>", поэтому в настоящее время я довольно тщательно проверяю все свои потенциально разрушительные вещи.

1 голос
/ 13 февраля 2009

Я никогда не видел случая, когда все записи необходимо было удалить, и очень немногие, где все должны быть обновлены. Я всегда считал это недостатком дизайна.

1 голос
/ 13 февраля 2009

Я тоже не знаю почему.

Я бы хотел, чтобы они это сделали. Несколько раз я хочу обновить все или удалить все, что мне может понадобиться написать ГДЕ 1 = 1.

Конечно, это не спасло бы Маноджа, который написал

DELETE FROM T2
  FROM Tbl T1, Tbl T2
 WHERE T1.TopLevelId = 'value'
1 голос
/ 13 февраля 2009

По той же причине вы можете иметь malloc без совпадения free в C: это ваша ответственность.

0 голосов
/ 05 августа 2009

Полагаю, это связано с тем, что язык манипулирования данными SQL вдохновлен теорией множеств.

Транзакции использования:)

0 голосов
/ 13 февраля 2009

Как полагает Мерфи: если что-то может пойти не так, то будет. «Все» было бы просто другим случаем.

...