Подтвердить что ты не робот

Каков наилучший способ отладки хранимых процедур (и написать sprocs, которые легче отлаживать)?

Каковы хорошие методологии для создания sprocs, которые уменьшают боль отладки? И какие инструменты существуют для отладки хранимых процедур?

Возможно, самое главное, что указывает на то, что эти ошибки происходят в sproc, а не в коде? Надеюсь, я не слишком могущественна здесь. Голоса для ответов на любой из вышеперечисленных. Спасибо.

Для чего это стоит, я работаю в среде .NET, SQL-серверах.

4b9b3361

Ответ 1

Один метод, который я использую в хранимых процедурах, чтобы упростить их отладку (без IDE или отладчиков) для процедур SQL Server 2005:

Я добавляю входной параметр с именем @Debug = 0 (по умолчанию 0 = выключен) в конце списка параметров для процедуры.

Затем добавляю if (@Debug = 1) print '...';

в коде на ключевых этапах для отображения любых полезных внутренних значений и т.д.

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

Рон

Ответ 2

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

   --**************************************************************************
   -- Create a log table variable to store messages to be returned to the
   -- calling application.
   --**************************************************************************
   declare @log             as table ( msg  varchar(MAX) );

then

     insert into @log values ('Inserted a new DVO Order into IRMA, order id: [' + convert(varchar(10), @@IDENTITY ) + ']');
etc.

then ...

   select msg from @log;
end

в конце процедуры - это зависит от того, насколько хорошо журнал вызывающего приложения выводится из вашего вызова процедуры, но приложение, которое я написал, записывает все это.: -)

Ответ 3

Я бы настоятельно предложил вам взглянуть на встроенный инструмент в студию управления SQL.

Я написал довольно подробное сообщение в блоге об этом здесь:

http://www.diaryofaninja.com/blog/2010/11/23/debugging-sql-queries-function-amp-stored-procedures-with-sql-management-studio

в основном суть заключается в том, что вы вводите запрос sql для выполнения вашей хранимой процедуры, а вместо нажатия F5 или нажатия восклицательного знака, вы нажимаете кнопку воспроизведения и используете F10 и F11 для перехода к вашему сохраненному процессу.

очень очень удобно - и никто, кажется, не использует его.

Ответ 4

TSQLUnit

Это модульная платформа для SQL Server. Это не совсем классический инструмент отладки, но он позволяет вам писать модульные тесты для ваших хранимых процедур, которые могут чрезвычайно помочь в выявлении ошибок и подтверждении ожидаемого поведения.

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

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

Ответ 5

Я заметил множество предложений по использованию различных сред и методов для отладки SQL-процессов, но никто не упомянул DBFit. Если вы не знакомы с Fit и FitNesse тогда сделайте себе одолжение и посмотрите их. Используя эти три инструмента, вы можете быстро создать себе целый набор приемочных тестов, которые обеспечат вам спокойствие, зная, что вы можете реорганизовать безнаказанно.

DBFit - это просто серия Fit Fixtures, которая может использоваться для реализации базы данных. Используя Fitness, вы можете записать столько перестановок вызовов на ваш сохраненный proc, сколько хотите создать тесты для.

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

Ответ 6

Для инструментов вы можете использовать Visual Studio для отладки SP. Если хранимый процесс имеет длинную логику, вы можете реорганизовать его, создать отдельный хранимый процесс и вызвать его из основного хранимого процесса. Это также поможет сузить тестирование и облегчить вам поиск того, какая часть запросов неверна.

Ответ 7

Это может быть личное предпочтение, но мне очень трудно читать SQL-запросы, которые все удалены по одной длинной строке. Я предпочитаю следующий стиль отступа:

SELECT
    [Fields]
FROM
    Table
WHERE
    x = x

Эта простая практика очень помогла мне при написании хранимых процедур для новой схемы базы данных. Разбирая заявления на многие строки, становится легче идентифицировать виновника ошибки в вашем запросе. Например, в SQL Server Management Studio указывается номер строки исключения, поэтому вы можете быстрее нападать на проблемный код.

Будьте спокойны в своих товарищах-разработчиках... не забивайте 800 символов SQL-запроса на одну строку. Позднее вы поблагодарите себя, если имя поля базы данных или тип данных изменится, и никто не отправит вам электронное письмо.

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

LEFT JOIN

Я сломал важную страницу за 20 минут, прежде чем мы выяснили, что это моя небольшая, брошенная хранимая процедура.

И убедитесь, что вы проверили свои процедуры при внесении изменений. Чтобы сделать это, мне нравится ставить простой тестовый запрос в комментарии к процедуре. Очевидно, я не смог сделать это сегодня: - (

/************************************
  MyProcName

  Test:
  -----
  exec MyProcName @myParam
*************************************/

Ответ 11

Это может быть не тот ответ, который вы ищете, но если вы уже находитесь в среде .NET. LINQtoSQL значительно сократил количество хранимых процессов, которые я пишу/использую/должен отлаживать.

Трудность отладки SQL - одна из причин, по которой бизнес-логика программирования в LINQ является моей новой предпочтительной практикой.

Ответ 12

Интегрированный отладчик SQL Server 2008 Management Studio сделал пошаговую отладку cinch (по сравнению с дзюдо, чтобы выяснить, как заставить VS2005 + SQL отлаживать)

Ответ 13

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

т.

Select * from LogEvent where BatchId = 'blah'

Образец вызова

EXEC LogEvent @Source='MyProc', @Type='Start'
, @Comment='Processed rows',@Value=50, @BatchId = @batchNum

Main Proc

CREATE PROCEDURE [dbo].[LogEvent]
    @Source varchar(50),
    @Type varchar(50),
    @Comment varchar(400),
    @Value decimal = null,
    @BatchId varchar(255) = 'BLANK'
AS

IF @BatchId = 'BLANK'
  SET @BatchId = NEWID()

  INSERT INTO dbo.Log
    (Source, EventTime, [Type], Comment, [Value],BatchId)
  VALUES
    (@Source, GETDATE(), @Type, @Comment, @Value,@BatchId)

Двигаясь вперед, было бы неплохо использовать CLR и посмотреть на вызов чего-то вроде Log4Net через SQL. Поскольку наш прикладной код использует Log4Net, было бы целесообразно проинтегрировать SQL-часть процессов в одну и ту же инфраструктуру.