Есть ли лучший способ отладки SQL? - PullRequest
8 голосов
/ 04 мая 2009

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

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

Ответы [ 5 ]

7 голосов
/ 04 мая 2009

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

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

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

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

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

1 голос
/ 04 мая 2009

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

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

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

1 голос
/ 04 мая 2009

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

Для меня лучше всего создать хорошую инфраструктуру для ведения журналов и использовать ее в своих sprocs.

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

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

0 голосов
/ 09 июня 2009

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

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

остальное здесь

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