2009-05-04 4 views
5

Я работал с SQL уже несколько лет, прежде всего MySQL/PhpMyAdmin, но также Oracle/iSqlPlus и PL/SQL в последнее время. Я запрограммировал в PHP, Java, ActionScript и многое другое. Я понимаю, что SQL не является обязательным языком программирования, как и другие, но почему сообщения об ошибках кажутся гораздо менее специфичными в SQL? В других средах я указал прямо на корень проблемы. Чаще всего это не так, MySQL дает мне такие ошибки, как «error AROUND where u.id = ...» и печатает весь запрос. Это еще сложнее с хранимыми процедурами, где отладка может быть полным кошмаром.Есть ли лучший способ отладки SQL?

У меня отсутствует волшебный инструмент/язык/плагин/настройка, которая дает лучшую отчетность об ошибках или мы застряли в этом? Мне нужен отладчик или язык, который дает мне такое же количество контроля, что и Eclipse, когда я устанавливаю точки останова и набираю код. Это возможно?

+5

Похожи жалобой более правильный вопрос. Вам нужен лучший отладчик? Вы хотите получить лучшую базу данных? Что вы хотите зафиксировать? Где код, который не работает? –

+0

обновленный вопрос для ответа S.Lott –

+0

Возможно, было бы хорошо перефразировать ваш вопрос как «Есть ли способ улучшить (более подробные) сообщения об ошибках из SQL». В противном случае вы можете столкнуться с закрытием, поскольку «не вопрос». – lothar

ответ

5

Я думаю, что ответ заключается в том, что SQL - это язык, основанный на множестве, с прилагаемыми несколькими процедурами. Поскольку дизайнеры думали в терминах на основе набора, они не думали, что обычный тип отладки, который существуют на других языках, важен. Однако, я думаю, что некоторые из них меняются. Вы можете установить точки останова в SQL Server 2008. Я не использовал его на самом деле, так как у вас должны быть базы данных SQL Server 2008, прежде чем он будет работать, и большая часть наших данных по-прежнему является SQL Server 2000. Но она доступна, и она позволяет вам проходить через вещи. У вас все еще будут проблемы, когда ваш оператор select составляет 150 строк, и он знает, что синтаксис неверен, но он не может указывать точно, где, поскольку это все одна команда.

Лично, когда я пишу длинный процедурный пакет SP, я создаю тестовый режим, который включает в себя показ мне результатов, которые я делаю, значения ключевых переменных в определенных точках, которые меня интересуют, и печать строк, которые позволяют я знаю, какие шаги были завершены, а затем перевернул все это, когда закончите. Таким образом, я могу видеть, что бы произошло, если бы оно работало по-настоящему, но не повредило какие-либо данные в базе данных, если я ошибаюсь. Я считаю это очень полезным. Тем не менее, он может значительно увеличить размер вашей программы. У меня есть шаблон, который я использую, который имеет большую часть структуры, в которой я нуждаюсь в настройке, поэтому мне не нужно слишком много времени делать. Тем более, что я никогда не добавляю вставку. обновить или удалить в proc без предварительной проверки соответствующего выбора, чтобы убедиться, что у меня есть записи, которые я хочу.

1

Я согласен с вашей жалобой.

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

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

Добавьте параметр отладки в sproc (по умолчанию «N») и передайте его любым другим вызовам, которые он вызывает, чтобы вы могли легко включать или отключать ведение журнала.

3

Я думаю, что объяснение состоит в том, что «обычные» языки имеют гораздо меньшие индивидуальные утверждения, чем SQL, поэтому гранулярность одного оператора указывает на гораздо меньшую часть кода в них, чем на SQL. Один оператор SQL может быть страницей или более длиной; на других языках это обычно одна строка.

Я не думаю, что это не позволяет отладчикам/IDE более точно идентифицировать ошибки, но я подозреваю, что это затрудняет работу.

1

Что касается точек останова и перехода по коду, вы можете сделать это с помощью MS SQL Server (на мой взгляд, это проще в 2005 году, чем в 2000 году).

Для простых случаев, ранняя разработка отладки, иногда загадочные сообщения обычно достаточно хороши, чтобы устранить ошибку - синтаксическая ошибка, не может делать X с Y. Если я в жестком sproc, Вернемся к отладке «printf» в тексте sproc, потому что это быстро и просто. Через некоторое время с вашей базой данных выбор, простые проблемы становятся старой шляпой, и вы просто принимаете их в шаге.

Однако, как только код будет выпущен, сложность проблем слишком высока. Я считаю себя счастливым, если я могу воспроизвести их. Кроме того, в тех местах, где разработчик во мне захочет отладчика, администратор базы данных во мне говорит, что «вы не помещаете там отладчик».

0

Я использую следующую тактику.

При записи хранимой процедуры каждый раз, когда выполняется новый логический шаг, выполняется @procStep var . set @procStep = «Что происходит ... здесь»;

остального here

Смежные вопросы