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


Анализ кода SQL для улучшения качества кода

Применимо к:SQL ServerБазы данных Azure SQLУправляемому экземпляру Azure SQLБазе данных SQL в Microsoft Fabric

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

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

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

  • Проблемы именования T-SQL возникают, если имя объекта базы данных может привести к непредвиденным проблемам или нарушение стандартных соглашений.

  • Проблемы с производительностью T-SQL включают код, который может заметно снизить скорость выполнения операций базы данных. Многие из этих проблем указывают на код, который приведет к сканированию таблицы при его выполнении.

    снимок экрана: параметры проекта SQL Server Data Tools для правил анализа кода.

Правила анализа кода расширяемы. Вы можете создать собственные правила для применения собственных стандартов кодирования. Дополнительные сведения см. в разделе "Общие сведения о расширяемости правил анализа кода".

Пример и синтаксис файла проекта SQL

Файл проекта SQL может содержать два свойства: RunSqlCodeAnalysis и SqlCodeAnalysisRules. Элемент RunSqlCodeAnalysis указывает, выполняется ли анализ кода при построении проекта. По умолчанию все включенные правила выполняются и обнаружение шаблонов правил приводит к предупреждению сборки.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
  <Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
  <PropertyGroup>
    <Name>AdventureWorks</Name>
    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
    <ModelCollation>1033, CI</ModelCollation>
    <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
  </PropertyGroup>
...

Элемент SqlCodeAnalysisRules задает правила и их поведение в случае ошибки или предупреждения. В следующем примере правила Microsoft.Rules.Data.SR0006 и Microsoft.Rules.Data.SR0007 отключены, а обнаружение правила Microsoft.Rules.Data.SR008 приведет к ошибке сборки.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
  <Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
  <PropertyGroup>
    <Name>AdventureWorks</Name>
    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
    <ModelCollation>1033, CI</ModelCollation>
    <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
    <SqlCodeAnalysisRules>-Microsoft.Rules.Data.SR0006;-Microsoft.Rules.Data.SR0007;+!Microsoft.Rules.Data.SR0008</SqlCodeAnalysisRules>
  </PropertyGroup>
...

Файл StaticCodeAnalysis.SuppressMessages.xml можно добавить в проект для подавления определенных результатов анализа кода. В следующем примере предупреждение SR0001 для хранимой процедуры в файле StoredProcedures/uspGetEmployeeManagers.sqlподавляется.

<?xml version="1.0" encoding="utf-8" ?>
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
  <SuppressedFile FilePath="StoredProcedures/uspGetEmployeeManagers.sql">
    <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0001" />
  </SuppressedFile>
</StaticCodeAnalysis>

Предоставленные правила

Проблемы с проектированием T-SQL

При анализе кода T-SQL в проекте базы данных один или несколько предупреждений могут быть классифицированы как проблемы с проектированием. Чтобы избежать следующих ситуаций, следует устранить проблемы с проектированием.

  • Последующие изменения в базе данных могут нарушить приложения, зависящие от него.
  • Код может не привести к ожидаемому результату.
  • Код может прерваться, если он запускается с будущими выпусками SQL Server.

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

Указанные правила определяют следующие проблемы проектирования:

Проблемы с именованием T-SQL

При анализе кода T-SQL в проекте базы данных один или несколько предупреждений могут быть классифицированы как проблемы именования. Чтобы избежать следующих ситуаций, следует устранить проблемы с именованием:

  • Имя, указанное для объекта, может конфликтовить с именем системного объекта.
  • Указанное имя всегда должно быть заключено в escape-символы (в SQL Server, "[" и "]").
  • Указанное имя может запутать других, которые пытаются прочитать и понять код.
  • Код может прерваться, если он запускается с будущими выпусками SQL Server.

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

Указанные правила определяют следующие проблемы проектирования:

Проблемы с производительностью T-SQL

При анализе кода T-SQL в проекте базы данных один или несколько предупреждений могут быть классифицированы как проблемы с производительностью. Чтобы избежать следующей ситуации, следует устранить проблему производительности:

  • При выполнении кода выполняется сканирование таблицы.

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

Указанные правила определяют следующие проблемы проектирования:

Включение и отключение анализа кода

Чтобы включить или отключить анализ кода SQL в Visual Studio, щелкните проект правой кнопкой мыши в Обозреватель решений и выберите "Свойства". На вкладке "Анализ кода" окна свойств выберите нужные параметры анализа кода.

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

Чтобы включить или отключить анализ кода SQL в проектах SQL в стиле SDK (предварительный просмотр), редактируйте файл .sqlproj напрямую. Откройте файл .sqlproj в окне 'Обозреватель решений', дважды щелкнув на проекте.

В текстовом редакторе добавьте элемент <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis> в первый <PropertyGroup> блок, чтобы включить анализ кода. Чтобы отключить анализ кода, измените значение элемента RunSqlCodeAnalysis на True или False или полностью удалите элемент.

Чтобы включить или отключить анализ кода SQL в расширении "Проекты базы данных SQL", измените этот файл напрямую .sqlproj. .sqlproj Откройте файл из представления обозревателя или щелкните правой кнопкой мыши проект в представлении "Проекты баз данных" и выберите "Изменить SQLPROJ-файл".

В текстовом редакторе добавьте элемент <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis> в первый <PropertyGroup> блок, чтобы включить анализ кода. Чтобы отключить анализ кода, измените значение элемента RunSqlCodeAnalysis на True или False или полностью удалите элемент.

Чтобы включить или отключить анализ кода SQL в SQL Server Management Studio (SSMS), щелкните проект правой кнопкой мыши в обозревателе решений и выберите "Свойства". На вкладке "Анализ кода" окна свойств выберите нужные параметры анализа кода.

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

Чтобы переопределить параметры анализа кода в файле проекта, вы можете использовать свойства /p:RunSqlCodeAnalysis и /p:SqlCodeAnalysisRules вместе с командой dotnet build. Например, чтобы выполнить сборку с отключенным анализом кода:

dotnet build /p:RunSqlCodeAnalysis=False

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

dotnet build /p:RunSqlCodeAnalysis=True /p:SqlCodeAnalysisRules="+!Microsoft.Rules.Data.SR0001;+!Microsoft.Rules.Data.SR0008"