Почему SQL Server не сделал предложение WHERE обязательным по умолчанию? - PullRequest
11 голосов
/ 17 мая 2009

Мне кажется, что ежу понятно. Я слышал бесчисленные истории о людях, которые забывают предложение WHERE в ОБНОВЛЕНИИ или УДАЛЕНИИ и уничтожают всю таблицу. Я знаю, что неосторожные люди не должны выдавать запросы напрямую и все такое ... и что есть законные случаи, когда вы хотите воздействовать на все строки, но не имеет ли смысла включать опцию по умолчанию, требующую таких запросов быть написано как:

UPDATE MyTable SET MyColumn = 0 WHERE *

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

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

Ответы [ 9 ]

10 голосов
/ 17 мая 2009

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

6 голосов
/ 17 мая 2009

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

BEGIN TRAN

UPDATE MyTable SET MyColumn = 0

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

COMMIT TRAN
5 голосов
/ 17 мая 2009

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

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

4 голосов
/ 17 мая 2009

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

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

Что я обычно делаю, кроме подсказки Робина (ВСЕГДА открывать транзакцию), чтобы выполнить запрос с помощью select, просто чтобы посмотреть записи, которые будут обновлены, что-то вроде этого

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

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

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

4 голосов
/ 17 мая 2009

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

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

Неявное «ВСЕ СТРОКИ» кажется гораздо более опасным, чем неявное «НЕТ СТРОК».

4 голосов
/ 17 мая 2009

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

Предотвращение этого события разрушит все веселье!

:)

1 голос
/ 02 апреля 2010

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

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

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

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

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

0 голосов
/ 18 мая 2009

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

0 голосов
/ 17 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...