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

В дополнение к ответу Марко Бонелли: лучший текущий способ взаимодействия между фреймами / фреймами использует window.postMessage , , поддерживаемый всеми браузерами

21
задан Torsten Marek 26 September 2008 в 21:26
поделиться

12 ответов

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

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

я тогда добавляю, печатают ли (@Debug = 1) '...';

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

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

Ron

9
ответ дан 29 November 2019 в 20:44
поделиться

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

   --**************************************************************************
   -- 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

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

8
ответ дан 29 November 2019 в 20:44
поделиться

TSQLUnit

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

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

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

3
ответ дан 29 November 2019 в 20:44
поделиться

Я заметил, что много предложений при использовании различных сред и методов отлаживает SQL procs, но никто не упомянул DBFit. Если Вы не знакомы с Соответствие и , FitNesse тогда делает себе одолжение и ищет их. Используя эти три инструмента можно быстро создать себя весь комплект приемочных испытаний, которые дадут Вам душевное спокойствие, зная, что можно осуществить рефакторинг безнаказанно.

DBFit является просто серией Пригодных Приспособлений, которые могут использоваться для осуществления базы данных. Используя Фитнес можно записать столько перестановок вызовов на сохраненный proc, сколько Вы хотите создать тесты для.

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

3
ответ дан 29 November 2019 в 20:44
поделиться

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

2
ответ дан 29 November 2019 в 20:44
поделиться

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

SELECT
    [Fields]
FROM
    Table
WHERE
    x = x

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

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

2
ответ дан 29 November 2019 в 20:44
поделиться

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

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

1
ответ дан 29 November 2019 в 20:44
поделиться

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

1
ответ дан 29 November 2019 в 20:44
поделиться

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

LEFT JOIN

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

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

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

  Test:
  -----
  exec MyProcName @myParam
*************************************/
1
ответ дан 29 November 2019 в 20:44
поделиться

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

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

1
ответ дан 29 November 2019 в 20:44
поделиться

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

1
ответ дан 29 November 2019 в 20:44
поделиться

Подобно протоколу Рона, мы вызываем процесс регистрации через все другие хранимые процедуры, чтобы помочь в отслеживании всех вызовов. Общий 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-сторону процессов в одну и ту же инфраструктуру.

1
ответ дан 29 November 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: