Запросы к БД, опечатки и строгая типизация
Feb. 1st, 2010 07:11 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Неоднократно читал истории, типа этой, когда из-за мелкой опечатки убивалась целая таблица данных.
И каждый раз удивляюсь тому, что разработчики СУБД ложат хер на теорию ради экономии на паре символов и псевдолаконичности и что SQL в разных серверах по разному реагирует на ошибки в типах данных.
А вот была бы строгая типизация - большая часть этих запросов ну нихрена бы тайпчекер не прошла.
Кстати, в этом плане полезен Firebird - там разработчики стараются жостко следовать стандартам, вплоть до того, что ломают обратную совместимость при переходе между версиями, если этого требует кошеризация.
Я вот жалею, что у меня почти нет опыта работы с Postgresql и Oracle - было бы очень интересно сравнить подходы на этот счет в разных серверах, а не только Firebird с MSSQL.
И каждый раз удивляюсь тому, что разработчики СУБД ложат хер на теорию ради экономии на паре символов и псевдолаконичности и что SQL в разных серверах по разному реагирует на ошибки в типах данных.
А вот была бы строгая типизация - большая часть этих запросов ну нихрена бы тайпчекер не прошла.
Кстати, в этом плане полезен Firebird - там разработчики стараются жостко следовать стандартам, вплоть до того, что ломают обратную совместимость при переходе между версиями, если этого требует кошеризация.
Я вот жалею, что у меня почти нет опыта работы с Postgresql и Oracle - было бы очень интересно сравнить подходы на этот счет в разных серверах, а не только Firebird с MSSQL.
no subject
Date: 2010-02-01 07:37 pm (UTC)no subject
Date: 2010-02-01 07:44 pm (UTC)no subject
Date: 2010-02-02 12:23 am (UTC)Условие, кстати, MySQL специфичное, это чистая бага, потому что MySQL вообще-то опен сурс поделие и никому ничего не обещало. Исправить раз плюнуть, это можете сделать даже Вы.
no subject
Date: 2010-02-01 08:09 pm (UTC)Которое, в свою очередь вычисляется через предикат:
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <unique predicate>
| <match predicate>
| <overlaps predicate>
Где я никак в упор не вижу id - 1. Т.е. это либо криворукость самописного парсера SQL, либо навороченность админки 1ц, либо навороченность диалекта SQL от MYSQL.
no subject
Date: 2010-02-02 06:01 am (UTC)no subject
Date: 2010-02-02 10:29 am (UTC)no subject
Date: 2010-02-01 08:35 pm (UTC)no subject
Date: 2010-02-01 09:02 pm (UTC)Если действительно нужно обновить всех, проблемы отключить констрейнт при наличии прав обычно нету.
no subject
Date: 2010-02-01 08:47 pm (UTC)и в случаях, когда пишу на pl/sql и нет гарантий того, что update/delete исполнится без промашек в where, вручную проверяю количество задетых строк, типа "assert(sql%rowcount <= 1)". Сложностей мало, но неинформативный ассерт лучше, чем ошибка в логике.
А про то, что в оракле NULL эквивалентен пустой строке -- о да. Уже долго шлю лучи рака яичек тому, кто принял это решение.
no subject
Date: 2010-02-01 08:57 pm (UTC)А вообще да, выглядит сомнительно. MSSQL такое не пропустит, насколько я помню; более того, там вообще СУБД не указана...
no subject
Date: 2010-02-01 09:07 pm (UTC)no subject
Date: 2010-02-01 11:50 pm (UTC)Мало кто полностью инициализирует все свойства соединения с БД сразу после его создания, обычно остается куча дефолтов из свойств логина или базы. Дефолтовый язык директорского логина поменять - и привет :)
Но вообще, конечно - параметризация спасет мир. Осталось только заставить этот мир ею пользоваться, пока он нахрен не вымер.
no subject
Date: 2010-02-02 07:35 am (UTC)Кстати, MSSQL умеет при парсинге запроса возвращать список и типы параметров?
А то я с ним иначе как через ADO.NET не работал, а там такое вообще не предусмотрено - список параметров заполнять исключительно ручками.
no subject
Date: 2010-02-02 08:40 am (UTC)Правда, когда потом смотришь в профайлер, что же там реально бегает, то становится слегка нехорошо...
no subject
Date: 2010-02-02 07:19 am (UTC)no subject
Date: 2010-02-02 10:27 am (UTC)Типа если у меня в базе миллион строк, а квери затрагивает одну, то пускать без капчи. А если 500 тыщ, то раза два должно спросить.
no subject
Date: 2010-02-04 11:51 am (UTC)