Запросы к БД, опечатки и строгая типизация
Неоднократно читал истории, типа этой, когда из-за мелкой опечатки убивалась целая таблица данных.
И каждый раз удивляюсь тому, что разработчики СУБД ложат хер на теорию ради экономии на паре символов и псевдолаконичности и что SQL в разных серверах по разному реагирует на ошибки в типах данных.
А вот была бы строгая типизация - большая часть этих запросов ну нихрена бы тайпчекер не прошла.
Кстати, в этом плане полезен Firebird - там разработчики стараются жостко следовать стандартам, вплоть до того, что ломают обратную совместимость при переходе между версиями, если этого требует кошеризация.
Я вот жалею, что у меня почти нет опыта работы с Postgresql и Oracle - было бы очень интересно сравнить подходы на этот счет в разных серверах, а не только Firebird с MSSQL.
И каждый раз удивляюсь тому, что разработчики СУБД ложат хер на теорию ради экономии на паре символов и псевдолаконичности и что SQL в разных серверах по разному реагирует на ошибки в типах данных.
А вот была бы строгая типизация - большая часть этих запросов ну нихрена бы тайпчекер не прошла.
Кстати, в этом плане полезен Firebird - там разработчики стараются жостко следовать стандартам, вплоть до того, что ломают обратную совместимость при переходе между версиями, если этого требует кошеризация.
Я вот жалею, что у меня почти нет опыта работы с Postgresql и Oracle - было бы очень интересно сравнить подходы на этот счет в разных серверах, а не только Firebird с MSSQL.
no subject
no subject
no subject
Условие, кстати, MySQL специфичное, это чистая бага, потому что MySQL вообще-то опен сурс поделие и никому ничего не обещало. Исправить раз плюнуть, это можете сделать даже Вы.
no subject
Которое, в свою очередь вычисляется через предикат:
<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
no subject
no subject
no subject
Если действительно нужно обновить всех, проблемы отключить констрейнт при наличии прав обычно нету.
no subject
и в случаях, когда пишу на pl/sql и нет гарантий того, что update/delete исполнится без промашек в where, вручную проверяю количество задетых строк, типа "assert(sql%rowcount <= 1)". Сложностей мало, но неинформативный ассерт лучше, чем ошибка в логике.
А про то, что в оракле NULL эквивалентен пустой строке -- о да. Уже долго шлю лучи рака яичек тому, кто принял это решение.
no subject
А вообще да, выглядит сомнительно. MSSQL такое не пропустит, насколько я помню; более того, там вообще СУБД не указана...
no subject
no subject
Мало кто полностью инициализирует все свойства соединения с БД сразу после его создания, обычно остается куча дефолтов из свойств логина или базы. Дефолтовый язык директорского логина поменять - и привет :)
Но вообще, конечно - параметризация спасет мир. Осталось только заставить этот мир ею пользоваться, пока он нахрен не вымер.
no subject
Кстати, MSSQL умеет при парсинге запроса возвращать список и типы параметров?
А то я с ним иначе как через ADO.NET не работал, а там такое вообще не предусмотрено - список параметров заполнять исключительно ручками.
no subject
Правда, когда потом смотришь в профайлер, что же там реально бегает, то становится слегка нехорошо...
no subject
no subject
Типа если у меня в базе миллион строк, а квери затрагивает одну, то пускать без капчи. А если 500 тыщ, то раза два должно спросить.
no subject