Поделиться через


Пошаговое руководство. Анализ кода Transact-SQL для имеющейся базы данных

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

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

Обязательные компоненты

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

Настройка правил для анализа проекта базы данных

  1. Откройте решение MyAdvWorks в среде Visual Studio.

  2. Разверните узел проекта базы данных в представлении схемы, если он еще не развернут.

  3. В меню Данные выберите последовательно пункты Статический анализ кода и Настроить.

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

  4. В списке Правила разверните узлы "Конструктор", "Именование" и "Производительность" для отображения правил, доступных для анализа кода Transact-SQL.

  5. Убедитесь, что флажки установлены для всех правил.

    Чтобы установить или снять флажки для всех правил в категории, можно установить или снять флажок рядом с категорией правил, например "Конструктор".

    Примечание

    Нарушение правила можно интерпретировать не как предупреждение, а как ошибку, установив для него флажок Рассматривать предупреждение как ошибку.

  6. В меню Файл выберите команду Сохранить все.

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

Анализ проекта базы данных

  • В меню Данные выберите Статический анализ кода и нажмите кнопку Выполнить.

    Будет выполнен анализ кода Transact-SQL в проекте базы данных, а полученные предупреждения будут внесены в Список ошибок. Если окно Список ошибок не отображается, откройте меню Вид и выберите пункт Список ошибок.

    Далее нужно просмотреть одно из предупреждений и устранить причину его отображения.

Просмотр предупреждения и устранение его причины

  1. Найдите следующее предупреждение в окне Список ошибок:

    SR0014 : Microsoft.Rules.Data: возможно, при приведении ASCII String(1) к SmallInt произошла ошибка.

    Код, ставший причиной отображения этого предупреждения, содержится в файле с именем "ufnGetStock.function.sql". Он расположен в строке 12, столбце 30.

  2. Щелкните правой кнопкой мыши предупреждение в окне Список ошибок и выберите команду Показать справочные сведения об ошибке.

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

  3. В окне Список ошибок щелкните дважды предупреждение или выделите его и нажмите клавишу ВВОД.

    В редакторе кода Transact-SQL откроется и отобразится код, ставший причиной предупреждения. Курсор будет отображаться в начальной строчке кода, являющегося причиной предупреждения. В данном случае курсор будет находиться в начале выражения FROM, поскольку целочисленный номер столбца LocationID сравнивается с односимвольной константой '6'. Отобразится следующий код:

    CREATE FUNCTION [dbo].[ufnGetStock](@ProductID [int])
    RETURNS [int] 
    AS 
    -- Returns the stock level for the product. This function is used internally only
    BEGIN
        DECLARE @ret int;
    
        SELECT @ret = SUM(p.[Quantity]) 
        FROM [Production].[ProductInventory] p 
        WHERE p.[ProductID] = @ProductID 
            AND p.[LocationID] = '6'; -- Only look at inventory in the misc storage
    
        IF (@ret IS NULL) 
            SET @ret = 0
    
        RETURN @ret
    END;
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Scalar function returning the quantity of inventory in LocationID 6 (Miscellaneous Storage)for a specified ProductID.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock';
    
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Input parameter for the scalar function ufnGetStock. Enter a valid ProductID from the Production.ProductInventory table.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock', @level2type = N'PARAMETER', @level2name = N'@ProductID';
    
  4. Обновите код инструкции SELECT в соответствии со следующим примером:

        SELECT @ret = SUM(p.[Quantity]) 
        FROM [Production].[ProductInventory] p 
        WHERE p.[ProductID] = @ProductID 
            AND p.[LocationID] = 6; -- Only look at inventory in the misc storage
    
  5. В меню Файл выберите пункт Сохранить ufnGetStock.function.sql.

    Далее нужно просмотреть и отключить второе предупреждение.

Просмотр и отключение предупреждение анализа кода

  1. Найдите следующее предупреждение в окне Список ошибок:

    SR0011 : Microsoft.Rules.Data: Object name(Database Version) contains special characters.

    Код, ставший причиной отображения этого предупреждения, содержится в файле с именем "AWBuildVersion.table.sql". Он расположен в строке 3, столбце 5.

    В этот момент можно решить, нужно ли исключить специальные знаки из имени объекта. С помощью рефакторинга базы данных можно автоматически обновить все ссылки на этот объект, чтобы в них содержались правильные имена. Однако это приведет к нарушению работы всех приложений, зависящих от старого имени. При отсутствии достаточных сведений для выбора оптимального подхода можно отключить предупреждения до тех пор, пока не будут изучены последствия такого изменения Кроме того, можно создать в Visual Studio Team Foundation Server рабочий элемент для отслеживания данной задачи или даже назначить ее другому лицу.

  2. В окне Список ошибок щелкните заголовок столбца "Описание".

    Предупреждения в окне Список ошибок будут отсортированы по описанию, а все предупреждения SR0011 будут сгруппированы вместе.

  3. Пролистайте содержимое окна Список ошибок до предупреждения SR0011, а затем выделите это предупреждение.

    При необходимости пропустить несколько предупреждений подряд эти предупреждения можно выделить, щелкнув в списке первое из них, а затем щелкнуть последнее предупреждение, удерживая нажатой клавишу SHIFT.

    Примечание

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

  4. Щелкните правой кнопкой мыши любую выделенную строку и выберите команду Подавить сообщения статического анализа кода.

    В проект базы данных будет добавлен файл с именем StaticCodeAnalysis.SuppressMessages.xml. И системы управления версиями будет извлечен файл с именем MyAdvWorks.dbproj. Отключенные предупреждения перестают отображаться в окне Список ошибок, и предупреждений в списке становится меньше.

    Примечание

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

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

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

Повторный анализ проекта базы данных

  • В меню Данные выберите Статический анализ кода и нажмите кнопку Выполнить.

    Будет выполнен повторный анализ кода Transact-SQL в проекте базы данных, и в окне Список ошибок отобразятся оставшиеся предупреждения. Отключенные предупреждения и предупреждения, причина которых была устранена, не отображаются.

Следующие действия

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

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

См. также

Основные понятия

Анализ кода базы данных с целью улучшения качества кода