Почему SQL Server не сделал обязательным условие WHERE по умолчанию?

Кажется, мне неинтересно. Я слышал бесчисленные истории о том, что люди забывают предложение WHERE в UPDATE или DELETE и уничтожают всю таблицу. Я знаю, что неосторожные люди не должны выпускать запросы напрямую и все такое... и что есть законные случаи, когда вы хотите повлиять на все строки, но не имело бы смысла иметь по умолчанию вариант, который требует таких запросов для написания:

UPDATE MyTable SET MyColumn = 0 WHERE *

Или, не меняя язык,

UPDATE MyTable SET MyColumn = 0 WHERE 1 = 1 -- tacky, I know

Ответ 1

Невозможно ли установить auto commit на false в сеансе клиента по умолчанию? Вы должны выдать "фиксацию", чтобы увидеть ваши изменения таким образом, почти "вы уверены, что хотите это сделать?". мода.

Я считаю, что это был дефолт для всех клиентов Oracle TOAD у бывшего работодателя.

Ответ 2

Потому что spec не требует этого, и вы не должны запускать ad hoc sql непосредственно против производственных данных.

Ответ 3

Чтобы играть в нее безопасно, мы всегда можем запускать транзакцию:

BEGIN TRAN

UPDATE MyTable SET MyColumn = 0

Затем, если количество строк выглядит хорошо:

COMMIT TRAN

Ответ 4

Выполнение этой ошибки - длительный укорененный обряд для программистов. Мы все это сделали - и рояльно испортили производственные данные - многому научились в процессе его исправления. Вы только делаете эту ошибку один раз, так что весело наблюдать за тем, как разработчик входит в ряды, когда это происходит.

Предотвращение этого может испортить все удовольствие!

:)

Ответ 5

Джоэл, я думаю, что вопрос Джоша заключается в том, почему спецификация не требует этого, или в лизинге есть опция Параметр, который потребует от него конкретной базы данных?

Поскольку спецификация не требует его, как вы говорите, есть возможность ошибочного запроса (либо ad hoc, либо просто программной ошибки) для изменения строк в базе данных, которую вы не намеревались изменить.

Неявное "ВСЕ ROWS" кажется более опасным, чем неявное "NO ROWS".

Ответ 6

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

На деле я считаю, что это действительно хорошо, могут быть некоторые настройки, такие как "SAFE_UPDATE" или что-то в этом роде...

что я обычно делаю, помимо подсказки robin (ALLWAYS open transaction), заключается в том, чтобы запускать запрос с помощью select, просто чтобы посмотреть на записи, которые будут обновлены, что-то вроде этого

update mytable set column = xx
-- select * from mytable
where mycondition = mycondition

перед обновлением я просто выбираю из select и вижу, что он возвращает...

В любом случае, у вас всегда есть резервная копия (я слышал, что снимки sql 2005 тоже довольно крутые) и работают внутри транзакции...

Ответ 7

MySQL предоставляет эту опцию для специальных запросов. Он назвал --safe-updates (или -i-am-a-dummy). Как указывали другие, мы все совершили эту ошибку один раз. Те из нас, кто запускает специальные запросы все время, иногда в 1:00, совершили ошибку более одного раза.

Хотя я обычно ненавижу "идиотские доказательства" и "вы уверены", Мне нравится этот вариант. Вы всегда должны быть осторожны, но даже быть осторожными вы сделаете, пожалуй, одну ошибку за тысячу часов. Если вы проводите 50 часов неделя зарегистрирована как root на производственных системах, одна ошибка за тысячу часов составляет 2 1/2 крупных винта в год. По этой причине, и еще один, мы находим --safe-updates - очень полезно.

Есть две причины, что это более полезно, чем большинство MS-подтверждения Сообщения. Сначала он ловит что-то, что скорее всего будет ошибкой, в отличие от "вы уверены, что хотите удалить этот файл?". Большинство удалений файлов действительно желательны, поэтому подтверждение - раздражение. Большинство "удалить из пользователи ", если отсутствует предложение where, действительно является ошибкой. Во-вторых, это указывает точно, какова вероятная проблема - отсутствующее предложение where. Это как будто подтверждение удаления файла было достаточно умным, чтобы сказать "что бренд новая обновленная копия, а не старая копия, которую, по вашему мнению, вы удаляете. Ты действительно хотите удалить новую копию или вместо этого вы хотите удалить старый? "

Во всяком случае, вообще-то я ненавижу "доказательство идиота", но мне нравится --safe-updates, и если это вариант, те, кто этого не хочет, не должны его использовать. Моя единственная проблема заключается в том, что если вы постоянно работаете над системой, которая имеет эту функцию, кто-то может стать неряшливым и быть в беде, когда они переключаются на систему без него, например, переключение с MySQL на MSSQL.

Поцарапайте последнее предостережение - никто в здравом уме не переключится на MS после знакомство с открытым исходным кодом.:)

Ответ 8

Я знаю по опыту, что вы делаете это только один раз... после того, как это произойдет, как только вы всегда убедитесь, что никогда этого не повторите!

Ответ 9

На самом деле не все так необычно, что вы хотите удалить или обновить все строки в таблице.