Bagikan melalui


Menulis aturan analisis kode kustom

Berlaku untuk: Database SQL ServerAzure SQL Database Azure SQL Managed InstanceSQL di Microsoft Fabric

Panduan ini menunjukkan langkah-langkah yang digunakan untuk membuat aturan analisis kode SQL Server. Aturan yang dibuat dalam panduan ini digunakan untuk menghindari WAITFOR DELAY pernyataan dalam prosedur, pemicu, dan fungsi tersimpan.

Dalam panduan ini, Anda membuat aturan kustom untuk analisis kode statis Transact-SQL dengan menggunakan langkah-langkah berikut:

  1. Buat proyek pustaka kelas, aktifkan penandatanganan untuk proyek tersebut, dan tambahkan referensi yang diperlukan.
  2. Buat dua kelas C# pembantu.
  3. Buat kelas aturan kustom C#.
  4. Bangun proyek pustaka kelas.
  5. Instal dan uji aturan analisis kode baru.

Kecuali untuk instruksi Visual Studio (SQL Server Data Tools), panduan ini berfokus pada proyek SQL bergaya SDK.

Prasyarat

Anda memerlukan komponen berikut untuk menyelesaikan panduan ini:

  • Versi Visual Studio terinstal, yang mencakup SQL Server Data Tools, dan mendukung pengembangan C# .NET Framework.
  • Proyek SQL Server yang berisi objek SQL Server.
  • Instans SQL Server tempat Anda dapat menyebarkan proyek database.

Panduan ini ditujukan untuk pengguna yang sudah terbiasa dengan fitur SQL Server SQL Server Data Tools. Anda harus terbiasa dengan konsep Visual Studio, seperti cara membuat pustaka kelas, menambahkan paket NuGet, dan cara menggunakan editor kode untuk menambahkan kode ke kelas.

Catatan

Karena keterbatasan pratinjau SQL Server Data Tools bergaya SDK, beberapa penginstalan Visual Studio diperlukan untuk menyelesaikan panduan ini. Penginstalan pertama diperlukan untuk membuat proyek pustaka kelas, penginstalan kedua diperlukan untuk membuat proyek database SQL bergaya SDK.

Panduan ini ditujukan untuk pengguna yang sudah terbiasa dengan fitur SQL Server SQL Server Data Tools. Anda harus terbiasa dengan konsep Visual Studio, seperti cara membuat pustaka kelas, menambahkan paket NuGet, dan cara menggunakan editor kode untuk menambahkan kode ke kelas.

  • Versi Visual Studio Code terinstal, yang mencakup ekstensi Proyek SQL Database.
  • Proyek database SQL yang berisi objek SQL.
  • .NET 8 SDK
  • Disarankan: Ekstensi C# Dev Kit untuk Visual Studio Code

Panduan ini ditujukan untuk pengguna yang sudah terbiasa dengan ekstensi Proyek SQL Database di Visual Studio Code. Anda harus terbiasa dengan konsep pengembangan, seperti cara membuat pustaka kelas, menambahkan paket, dan cara menggunakan editor kode untuk mengedit kode.

  • Editor teks, seperti editor file di Visual Studio Code.
  • Proyek database SQL yang berisi objek SQL.
  • .NET 8 SDK

Panduan ini ditujukan untuk pengguna yang sudah terbiasa dengan proyek SQL. Anda harus terbiasa dengan konsep pengembangan, seperti cara membuat pustaka kelas, menambahkan paket, dan cara menggunakan editor kode untuk mengedit kode.

Langkah 1: Membuat proyek pustaka kelas

Pertama-tama buat pustaka kelas. Untuk membuat proyek pustaka kelas:

  1. Buat proyek pustaka kelas C# (.NET Framework) bernama SampleRules.

  2. Ganti nama file Class1.cs menjadi AvoidWaitForDelayRule.cs.

  3. Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Tambahkan lalu Referensi.

  4. Pilih System.ComponentModel.Composition pada tab Assemblies\Frameworks .

  5. Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Kelola Paket NuGet. Temukan dan instal Microsoft.SqlServer.DacFx paket NuGet. Versi yang dipilih harus 162.x.x (misalnya 162.2.111) dengan Visual Studio 2022.

Selanjutnya, tambahkan kelas pendukung yang akan digunakan oleh aturan.

Pertama-tama buat pustaka kelas. Untuk membuat proyek pustaka kelas:

  1. Buat proyek pustaka kelas C# (.NET Framework) bernama SampleRules.

  2. Ganti nama file Class1.cs menjadi AvoidWaitForDelayRule.cs.

  3. Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Tambahkan lalu Referensi.

  4. Pilih System.ComponentModel.Composition pada tab Assemblies\Frameworks .

  5. Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Kelola Paket NuGet. Temukan dan instal Microsoft.SqlServer.DacFx paket NuGet. Versi yang dipilih harus 162.x.x (misalnya 162.2.111) dengan Visual Studio 2022.

Selanjutnya, tambahkan kelas pendukung yang akan digunakan oleh aturan.

  1. Mulai Visual Studio Code dan buka folder tempat Anda ingin membuat proyek.

  2. Buka jendela Terminal di Visual Studio Code dengan memilih menu Tampilan, lalu Terminal.

  3. Di Terminal, masukkan perintah berikut untuk membuat solusi dan proyek baru:

    dotnet new sln
    dotnet new classlib -n SampleRules -o SampleRules
    dotnet sln add SampleRules/SampleRules.csproj
    
  4. Ubah ke SampleRules direktori:

    cd SampleRules
    
  5. Tambahkan paket NuGet yang diperlukan:

    dotnet add package Microsoft.SqlServer.DacFx
    

Selanjutnya, tambahkan kelas pendukung yang akan digunakan oleh aturan.

  1. Buka perintah atau jendela terminal dan navigasikan ke folder tempat Anda ingin membuat proyek.

  2. Di Terminal, masukkan perintah berikut untuk membuat solusi dan proyek baru:

    dotnet new sln
    dotnet new classlib -n SampleRules -o SampleRules
    dotnet sln add SampleRules/SampleRules.csproj
    
  3. Ubah ke SampleRules direktori:

    cd SampleRules
    
  4. Tambahkan paket NuGet yang diperlukan:

    dotnet add package Microsoft.SqlServer.DacFx
    

Langkah 2: Membuat kelas pembantu aturan kustom

Sebelum Anda membuat kelas untuk aturan itu sendiri, tambahkan kelas pengunjung dan kelas atribut ke proyek. Kelas-kelas ini mungkin berguna untuk membuat lebih banyak aturan kustom.

Langkah 2.1: Tentukan kelas WaitForDelayVisitor

Kelas pertama yang harus Anda tentukan adalah WaitForDelayVisitor kelas , berasal dari TSqlConcreteFragmentVisitor. Kelas ini menyediakan akses ke WAITFOR DELAY pernyataan dalam model. Kelas pengunjung memanfaatkan API ScriptDom yang disediakan oleh SQL Server. Dalam API ini, kode Transact-SQL direpresentasikan sebagai pohon sintaks abstrak (AST) dan kelas pengunjung dapat berguna ketika Anda ingin menemukan objek sintaks tertentu seperti WAITFOR DELAY pernyataan. Pernyataan ini mungkin sulit ditemukan menggunakan model objek karena tidak terkait dengan properti atau hubungan objek tertentu, tetapi Anda dapat menemukannya menggunakan pola pengunjung dan API ScriptDom .

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik WaitForDelayVisitor.cs lalu pilih tombol Tambahkan . File WaitForDelayVisitor.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik WaitForDelayVisitor.cs lalu pilih tombol Tambahkan . File WaitForDelayVisitor.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Buka tampilan Explorer di Visual Studio Code.

  2. Buat file baru bernama WaitForDelayVisitor.cs di SampleRules folder .

  1. Arahkan ke direktori SampleRules.
  2. Buat file baru bernama WaitForDelayVisitor.cs.
  1. WaitForDelayVisitor.cs Buka file dan perbarui konten agar sesuai dengan kode berikut:

    using System.Collections.Generic;
    using Microsoft.SqlServer.TransactSql.ScriptDom;
    namespace SampleRules {
        class WaitForDelayVisitor {}
    }
    
  2. Dalam deklarasi kelas, ubah pengubah akses menjadi internal dan dapatkan kelas dari TSqlConcreteFragmentVisitor:

    internal class WaitForDelayVisitor : TSqlConcreteFragmentVisitor {}
    
  3. Tambahkan kode berikut untuk menentukan variabel Daftar anggota:

    public IList<WaitForStatement> WaitForDelayStatements { get; private set; }
    
  4. Tentukan konstruktor kelas dengan menambahkan kode berikut:

    public WaitForDelayVisitor() {
       WaitForDelayStatements = new List<WaitForStatement>();
    }
    
  5. Meng-override metode ExplicitVisit dengan menambahkan kode berikut:

    public override void ExplicitVisit(WaitForStatement node) {
       // We are only interested in WAITFOR DELAY occurrences
       if (node.WaitForOption == WaitForOption.Delay)
          WaitForDelayStatements.Add(node);
    }
    

    Metode ini mengunjungi pernyataan WAITFOR dalam model, dan menambahkan pernyataan-pernyataan yang memiliki opsi DELAY yang ditentukan ke dalam daftar pernyataan WAITFOR DELAY. Kelas kunci yang dirujuk adalah WaitForStatement.

  6. Pada menu File, pilih Simpan.

Langkah 2.2: Menambahkan file sumber daya dan tiga string sumber daya

Selanjutnya, tambahkan file sumber daya yang menentukan nama aturan, deskripsi aturan, dan kategori tempat aturan akan muncul di antarmuka konfigurasi aturan.

  1. Di Penjelajah Solusi, pilih SampleRules proyek. Pada menu Proyek , pilih Tambahkan lalu Item Baru. Kotak dialog Tambahkan Item Baru akan muncul.

  2. Dalam daftar Templat terinstal, pilih Umum. Di panel detail, pilih File Sumber Daya.

  3. Di Nama, ketik RuleResources.resx. Editor sumber daya muncul, tanpa sumber daya yang ditentukan.

  4. Tentukan empat string sumber daya sebagai berikut:

    Nama Nilai
    AvoidWaitForDelay_ProblemDescription WAITFOR DELAY statement was found in {0}.
    AvoidWaitForDelay_RuleName Avoid using WaitFor Delay statements in stored procedures, functions and triggers.
    CategorySamples SamplesCategory
    CannotCreateResourceManager Can't create ResourceManager for {0} from {1}.
  5. Pada menu File , pilih Simpan AturanResources.resx.

  1. Di Penjelajah Solusi, pilih SampleRules proyek. Pada menu Proyek , pilih Tambahkan lalu Item Baru. Kotak dialog Tambahkan Item Baru akan muncul.

  2. Dalam daftar Templat terinstal, pilih Umum. Di panel detail, pilih File Sumber Daya.

  3. Di Nama, ketik RuleResources.resx. Editor sumber daya muncul, tanpa sumber daya yang ditentukan.

  4. Tentukan empat string sumber daya sebagai berikut:

    Nama Nilai
    AvoidWaitForDelay_ProblemDescription WAITFOR DELAY statement was found in {0}.
    AvoidWaitForDelay_RuleName Avoid using WaitFor Delay statements in stored procedures, functions and triggers.
    CategorySamples SamplesCategory
    CannotCreateResourceManager Can't create ResourceManager for {0} from {1}.
  5. Pada menu File , pilih Simpan AturanResources.resx.

  1. SampleRules Di direktori, buat file baru bernama RuleResources.resx.

  2. Buka file RuleResources.resx dan tambahkan kode berikut:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <data name="AvoidWaitForDelay_ProblemDescription" xml:space="preserve">
        <value>WAITFOR DELAY statement was found in {0}</value>
      </data>
      <data name="AvoidWaitFormDelay_RuleName" xml:space="preserve">
        <value>Avoid using WaitFor Delay statements in stored procedures, functions and triggers.</value>
      </data>
      <data name="CategorySamples" xml:space="preserve">
        <value>SamplesCategory</value>
      </data>
      <data name="CannotCreateResourceManager" xml:space="preserve">
        <value>Can't create ResourceManager for {0} from {1}</value>
      </data>
    </root>
    
  3. Simpan file RuleResources.resx.

  4. SampleRules.csproj Buka file dan tambahkan kode berikut untuk memperbarui dan menyertakan konten sumber daya dalam proyek:

    <ItemGroup>
      <Compile Update="RuleResources.Designer.cs">
        <DesignTime>True</DesignTime>
        <AutoGen>True</AutoGen>
        <DependentUpon>RuleResources.resx</DependentUpon>
      </Compile>
    </ItemGroup>
    <ItemGroup>
      <EmbeddedResource Include="RuleResources.resx">
        <Generator>PublicResXFileCodeGenerator</Generator>
        <LastGenOutput>RuleResources.Designer.cs</LastGenOutput>
      </EmbeddedResource>
    </ItemGroup>
    
  5. Simpan file SampleRules.csproj.

  1. SampleRules Di direktori, buat file baru bernama RuleResources.resx.

  2. Buka file RuleResources.resx dan tambahkan kode berikut:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <data name="AvoidWaitForDelay_ProblemDescription" xml:space="preserve">
        <value>WAITFOR DELAY statement was found in {0}</value>
      </data>
      <data name="AvoidWaitFormDelay_RuleName" xml:space="preserve">
        <value>Avoid using WaitFor Delay statements in stored procedures, functions and triggers.</value>
      </data>
      <data name="CategorySamples" xml:space="preserve">
        <value>SamplesCategory</value>
      </data>
      <data name="CannotCreateResourceManager" xml:space="preserve">
        <value>Can't create ResourceManager for {0} from {1}</value>
      </data>
    </root>
    
  3. Simpan file RuleResources.resx.

  4. SampleRules.csproj Buka file dan tambahkan kode berikut untuk memperbarui dan menyertakan konten sumber daya dalam proyek:

    <ItemGroup>
      <Compile Update="RuleResources.Designer.cs">
        <DesignTime>True</DesignTime>
        <AutoGen>True</AutoGen>
        <DependentUpon>RuleResources.resx</DependentUpon>
      </Compile>
    </ItemGroup>
    <ItemGroup>
      <EmbeddedResource Include="RuleResources.resx">
        <Generator>PublicResXFileCodeGenerator</Generator>
        <LastGenOutput>RuleResources.Designer.cs</LastGenOutput>
      </EmbeddedResource>
    </ItemGroup>
    
  5. Simpan file SampleRules.csproj.

Langkah 2.3: Tentukan kelas LocalizedExportCodeAnalysisRuleAttribute

Kelas kedua adalah LocalizedExportCodeAnalysisRuleAttribute.cs. Ini adalah perluasan dari bawaan Microsoft.SqlServer.Dac.CodeAnalysis.ExportCodeAnalysisRuleAttribute yang disediakan oleh kerangka kerja, dan mendukung membaca DisplayName dan Description yang digunakan oleh aturan Anda dari berkas sumber daya. Ini adalah kelas yang berguna jika Anda berniat untuk menggunakan aturan Anda dalam beberapa bahasa.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik LocalizedExportCodeAnalysisRuleAttribute.cs lalu pilih tombol Tambahkan . File ditambahkan ke proyek di Penjelajah Solusi.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik LocalizedExportCodeAnalysisRuleAttribute.cs lalu pilih tombol Tambahkan . File ditambahkan ke proyek di Penjelajah Solusi.

  1. Navigasikan ke SampleRules direktori dalam tampilan Explorer di Visual Studio Code.
  2. Buat file baru bernama LocalizedExportCodeAnalysisRuleAttribute.cs.
  1. Arahkan ke direktori SampleRules.
  2. Buat file baru bernama LocalizedExportCodeAnalysisRuleAttribute.cs.
  1. Buka file dan perbarui konten agar sesuai dengan kode berikut:

    using Microsoft.SqlServer.Dac.CodeAnalysis;
    using System;
    using System.Globalization;
    using System.Reflection;
    using System.Resources;
    
    namespace SampleRules
    {
    
        internal class LocalizedExportCodeAnalysisRuleAttribute : ExportCodeAnalysisRuleAttribute
        {
            private readonly string _resourceBaseName;
            private readonly string _displayNameResourceId;
            private readonly string _descriptionResourceId;
    
            private ResourceManager _resourceManager;
            private string _displayName;
            private string _descriptionValue;
    
            /// <summary>
            /// Creates the attribute, with the specified rule ID, the fully qualified
            /// name of the resource file that will be used for looking up display name
            /// and description, and the Ids of those resources inside the resource file.
            /// </summary>
            public LocalizedExportCodeAnalysisRuleAttribute(
                string id,
                string resourceBaseName,
                string displayNameResourceId,
                string descriptionResourceId)
                : base(id, null)
            {
                _resourceBaseName = resourceBaseName;
                _displayNameResourceId = displayNameResourceId;
                _descriptionResourceId = descriptionResourceId;
            }
    
            /// <summary>
            /// Rules in a different assembly would need to overwrite this
            /// </summary>
            /// <returns></returns>
            protected virtual Assembly GetAssembly()
            {
                return GetType().Assembly;
            }
    
            private void EnsureResourceManagerInitialized()
            {
                var resourceAssembly = GetAssembly();
    
                try
                {
                    _resourceManager = new ResourceManager(_resourceBaseName, resourceAssembly);
                }
                catch (Exception ex)
                {
                    var msg = String.Format(CultureInfo.CurrentCulture, RuleResources.CannotCreateResourceManager, _resourceBaseName, resourceAssembly);
                    throw new RuleException(msg, ex);
                }
            }
    
            private string GetResourceString(string resourceId)
            {
                EnsureResourceManagerInitialized();
                return _resourceManager.GetString(resourceId, CultureInfo.CurrentUICulture);
            }
    
            /// <summary>
            /// Overrides the standard DisplayName and looks up its value inside a resources file
            /// </summary>
            public override string DisplayName
            {
                get
                {
                    if (_displayName == null)
                    {
                        _displayName = GetResourceString(_displayNameResourceId);
                    }
                    return _displayName;
                }
            }
    
            /// <summary>
            /// Overrides the standard Description and looks up its value inside a resources file
            /// </summary>
            public override string Description
            {
                get
                {
                    if (_descriptionValue == null)
                    {
                        _descriptionValue = GetResourceString(_descriptionResourceId);
                    }
                    return _descriptionValue;
                }
            }
        }
    }
    

Langkah 2.4: Tentukan kelas SampleConstants

Selanjutnya, tentukan kelas yang mereferensikan sumber daya dalam file sumber daya yang digunakan oleh Visual Studio untuk menampilkan informasi tentang aturan Anda di antarmuka pengguna.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik SampleRuleConstants.cs dan pilih tombol Tambahkan . File SampleRuleConstants.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik SampleRuleConstants.cs dan pilih tombol Tambahkan . File SampleRuleConstants.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Navigasikan ke SampleRules direktori dalam tampilan Explorer di Visual Studio Code.
  2. Buat file baru bernama SampleRuleConstants.cs.
  1. Arahkan ke direktori SampleRules.
  2. Buat file baru bernama SampleRuleConstants.cs.
  1. SampleRuleConstants.cs Buka file dan tambahkan pernyataan penggunaan berikut ke file:

    namespace SampleRules
    {
        internal static class RuleConstants
        {
            /// <summary>
            /// The name of the resources file to use when looking up rule resources
            /// </summary>
            public const string ResourceBaseName = "SampleRules.RuleResources";
    
            /// <summary>
            /// Lookup name inside the resources file for the select asterisk rule name
            /// </summary>
            public const string AvoidWaitForDelay_RuleName = "AvoidWaitForDelay_RuleName";
            /// <summary>
            /// Lookup ID inside the resources file for the select asterisk description
            /// </summary>
            public const string AvoidWaitForDelay_ProblemDescription = "AvoidWaitForDelay_ProblemDescription";
    
            /// <summary>
            /// The design category (should not be localized)
            /// </summary>
            public const string CategoryDesign = "Design";
    
            /// <summary>
            /// The performance category (should not be localized)
            /// </summary>
            public const string CategoryPerformance = "Design";
        }
    }
    
  2. Pada menu File, pilih Simpan.

Langkah 3: Membuat kelas aturan kustom

Setelah Anda menambahkan kelas pembantu yang akan digunakan aturan analisis kode kustom, buat kelas aturan kustom dan beri nama AvoidWaitForDelayRule. Aturan AvoidWaitForDelayRule kustom akan digunakan untuk membantu pengembang database menghindari WAITFOR DELAY pernyataan dalam prosedur tersimpan, pemicu, dan fungsi.

Langkah 3.1: Buat kelas AvoidWaitForDelayRule

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik AvoidWaitForDelayRule.cs lalu pilih Tambahkan. File AvoidWaitForDelayRule.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Di Penjelajah Solusi, pilih SampleRules proyek.

  2. Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik AvoidWaitForDelayRule.cs lalu pilih Tambahkan. File AvoidWaitForDelayRule.cs ditambahkan ke proyek di Penjelajah Solusi.

  1. Navigasikan ke SampleRules direktori dalam tampilan Explorer di Visual Studio Code.
  2. Buat file baru bernama AvoidWaitForDelayRule.cs.
  1. Arahkan ke direktori SampleRules.
  2. Buat file baru bernama AvoidWaitForDelayRule.cs.
  1. AvoidWaitForDelayRule.cs Buka file dan tambahkan pernyataan penggunaan berikut ke file:

    using Microsoft.SqlServer.Dac.CodeAnalysis;
    using Microsoft.SqlServer.Dac.Model;
    using Microsoft.SqlServer.TransactSql.ScriptDom;
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    namespace SampleRules {
        class AvoidWaitForDelayRule {}
    }
    
  2. AvoidWaitForDelayRule Dalam deklarasi kelas, ubah pengubah akses ke publik:

    /// <summary>
    /// This is a rule that returns a warning message
    /// whenever there is a WAITFOR DELAY statement appears inside a subroutine body.
    /// This rule only applies to stored procedures, functions and triggers.
    /// </summary>
    public sealed class AvoidWaitForDelayRule
    
  3. AvoidWaitForDelayRule Dapatkan kelas dari Microsoft.SqlServer.Dac.CodeAnalysis.SqlCodeAnalysisRule kelas dasar:

    public sealed class AvoidWaitForDelayRule : SqlCodeAnalysisRule
    
  4. Tambah LocalizedExportCodeAnalysisRuleAttribute ke kelas Anda.

    LocalizedExportCodeAnalysisRuleAttribute memungkinkan layanan analisis kode untuk menemukan aturan analisis kode kustom. Hanya kelas yang ditandai dengan ExportCodeAnalysisRuleAttribute (atau atribut yang mewarisi dari ini) yang dapat digunakan dalam analisis kode.

    LocalizedExportCodeAnalysisRuleAttribute menyediakan beberapa metadata yang diperlukan yang digunakan oleh layanan. Ini termasuk ID unik untuk aturan ini, nama tampilan yang ditampilkan di antarmuka pengguna Visual Studio, dan Description yang dapat digunakan oleh aturan Anda saat mengidentifikasi masalah.

    [LocalizedExportCodeAnalysisRule(AvoidWaitForDelayRule.RuleId,
        RuleConstants.ResourceBaseName,
        RuleConstants.AvoidWaitForDelay_RuleName,
        RuleConstants.AvoidWaitForDelay_ProblemDescription
        Category = RuleConstants.CategoryPerformance,
        RuleScope = SqlRuleScope.Element)]
    public sealed class AvoidWaitForDelayRule : SqlCodeAnalysisRule
    {
       /// <summary>
       /// The Rule ID should resemble a fully-qualified class name. In the Visual Studio UI
       /// rules are grouped by "Namespace + Category", and each rule is shown using "Short ID: DisplayName".
       /// For this rule, that means the grouping will be "Public.Dac.Samples.Performance", with the rule
       /// shown as "SR1004: Avoid using WaitFor Delay statements in stored procedures, functions and triggers."
       /// </summary>
       public const string RuleId = "RuleSamples.SR1004";
    }
    

    Properti RuleScope harus karena Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleScope.Element aturan ini menganalisis elemen tertentu. Aturan ini dipanggil sekali untuk setiap elemen yang cocok dalam model. Jika Anda ingin menganalisis seluruh model, maka Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleScope.Model dapat digunakan sebagai gantinya.

  5. Tambahkan konstruktor yang menyiapkan Microsoft.SqlServer.Dac.CodeAnalysis.SqlAnalysisRule.SupportedElementTypes. Ini diperlukan untuk aturan yang terlingkup elemen. Ini mendefinisikan jenis elemen yang diterapkan aturan ini. Dalam hal ini, aturan diterapkan ke prosedur, pemicu, dan fungsi tersimpan. Kelas mencantumkan Microsoft.SqlServer.Dac.Model.ModelSchema semua jenis elemen yang tersedia yang dapat dianalisis.

    public AvoidWaitForDelayRule()
    {
       // This rule supports Procedures, Functions and Triggers. Only those objects will be passed to the Analyze method
       SupportedElementTypes = new[]
       {
          // Note: can use the ModelSchema definitions, or access the TypeClass for any of these types
          ModelSchema.ExtendedProcedure,
          ModelSchema.Procedure,
          ModelSchema.TableValuedFunction,
          ModelSchema.ScalarFunction,
    
          ModelSchema.DatabaseDdlTrigger,
          ModelSchema.DmlTrigger,
          ModelSchema.ServerDdlTrigger
       };
    }
    
  6. Tambahkan penimpaan Microsoft.SqlServer.Dac.CodeAnalysis.SqlAnalysisRule.Analyze(Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleExecutionContext) untuk metode , yang menggunakan Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleExecutionContext sebagai parameter input. Metode ini mengembalikan daftar potensi masalah.

    Metode ini memperoleh Microsoft.SqlServer.Dac.Model.TSqlModel, , Microsoft.SqlServer.Dac.Model.TSqlObjectdan TSqlFragment dari parameter konteks. Kelas WaitForDelayVisitor kemudian digunakan untuk mendapatkan daftar semua WAITFOR DELAY pernyataan dalam model.

    Untuk setiap WaitForStatement dalam daftar tersebut, dibuat Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleProblem .

    /// <summary>
    /// For element-scoped rules the Analyze method is executed once for every matching
    /// object in the model.
    /// </summary>
    /// <param name="ruleExecutionContext">The context object contains the TSqlObject being
    /// analyzed, a TSqlFragment
    /// that's the AST representation of the object, the current rule's descriptor, and a
    /// reference to the model being
    /// analyzed.
    /// </param>
    /// <returns>A list of problems should be returned. These will be displayed in the Visual
    /// Studio error list</returns>
    public override IList<SqlRuleProblem> Analyze(
        SqlRuleExecutionContext ruleExecutionContext)
    {
         IList<SqlRuleProblem> problems = new List<SqlRuleProblem>();
    
         TSqlObject modelElement = ruleExecutionContext.ModelElement;
    
         // this rule does not apply to inline table-valued function
         // we simply do not return any problem in that case.
         if (IsInlineTableValuedFunction(modelElement))
         {
             return problems;
         }
    
         string elementName = GetElementName(ruleExecutionContext, modelElement);
    
         // The rule execution context has all the objects we'll need, including the
         // fragment representing the object,
         // and a descriptor that lets us access rule metadata
         TSqlFragment fragment = ruleExecutionContext.ScriptFragment;
         RuleDescriptor ruleDescriptor = ruleExecutionContext.RuleDescriptor;
    
         // To process the fragment and identify WAITFOR DELAY statements we will use a
         // visitor
         WaitForDelayVisitor visitor = new WaitForDelayVisitor();
         fragment.Accept(visitor);
         IList<WaitForStatement> waitforDelayStatements = visitor.WaitForDelayStatements;
    
         // Create problems for each WAITFOR DELAY statement found
         // When creating a rule problem, always include the TSqlObject being analyzed. This
         // is used to determine
         // the name of the source this problem was found in and a best guess as to the
         // line/column the problem was found at.
         //
         // In addition if you have a specific TSqlFragment that is related to the problem
         //also include this
         // since the most accurate source position information (start line and column) will
         // be read from the fragment
         foreach (WaitForStatement waitForStatement in waitforDelayStatements)
         {
            SqlRuleProblem problem = new SqlRuleProblem(
                String.Format(CultureInfo.CurrentCulture,
                    ruleDescriptor.DisplayDescription, elementName),
                modelElement,
                waitForStatement);
            problems.Add(problem);
        }
        return problems;
    }
    
    private static string GetElementName(
        SqlRuleExecutionContext ruleExecutionContext,
        TSqlObject modelElement)
    {
        // Get the element name using the built in DisplayServices. This provides a number of
        // useful formatting options to
        // make a name user-readable
        var displayServices = ruleExecutionContext.SchemaModel.DisplayServices;
        string elementName = displayServices.GetElementName(
            modelElement, ElementNameStyle.EscapedFullyQualifiedName);
        return elementName;
    }
    
    private static bool IsInlineTableValuedFunction(TSqlObject modelElement)
    {
        return TableValuedFunction.TypeClass.Equals(modelElement.ObjectType)
                       && FunctionType.InlineTableValuedFunction ==
            modelElement.GetMetadata<FunctionType>(TableValuedFunction.FunctionType);
    }
    
  7. Dari menu File , pilih Simpan.

Langkah 4: Bangun pustaka kelas

  1. Pada menu Proyek, pilih Properti SampleRules.
  2. Pilih tab Penandatanganan .
  3. Pilih Tanda tangani rakitan.
  4. Di Pilih file kunci nama yang kuat, pilih <Baru>.
  5. Dalam kotak dialog Buat Kunci Nama Kuat, di Nama file kunci, ketik MyRefKey.
  6. (opsional) Anda dapat menentukan kata sandi untuk file kunci nama yang kuat.
  7. Pilih OK.
  8. Pada menu Berkas, pilih Simpan Semua.
  9. Dari menu Buat, pilih Buat Solusi.
  1. Pada menu Proyek, pilih SampleRules Properties.
  2. Pilih tab Penandatanganan .
  3. Pilih Tanda tangani rakitan.
  4. Di Pilih file kunci nama yang kuat, pilih <Baru>.
  5. Dalam kotak dialog Buat Kunci Nama Kuat, di Nama file kunci, ketik MyRefKey.
  6. (opsional) Anda dapat menentukan kata sandi untuk file kunci nama yang kuat.
  7. Pilih OK.
  8. Pada menu Berkas, pilih Simpan Semua.
  9. Dari menu Buat, pilih Buat Solusi.
  1. Buka jendela Terminal di Visual Studio Code dengan memilih menu Tampilan , lalu Terminal.

  2. Di Terminal, masukkan perintah berikut untuk membangun proyek:

    dotnet build /p:Configuration=Release
    
  1. Arahkan ke direktori SampleRules.

  2. Jalankan perintah berikut untuk membangun proyek:

    dotnet build /p:Configuration=Release
    

Langkah 5: Menginstal dan menguji aturan analisis kode baru

Selanjutnya, Anda harus menginstal assembly agar dapat dimuat ketika Anda membuat proyek database SQL.

Untuk menginstal aturan yang akan berjalan saat Anda membuat proyek SQL asli dengan Visual Studio, Anda harus menyalin rakitan dan file terkait .pdb ke folder Ekstensi.

Langkah 5.1: Instal rakitan SampleRules

  1. Selanjutnya, salin informasi perakitan ke direktori Ekstensi. Saat Visual Studio dimulai, Visual Studio mengidentifikasi ekstensi apa pun di <Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensions direktori dan subdirektori, dan membuatnya tersedia untuk digunakan. Untuk Visual Studio 2022, <Visual Studio Install Dir> biasanya C:\Program Files\Microsoft Visual Studio\2022\Enterprise. Ganti Enterprise dengan Professional atau Community bergantung pada edisi Visual Studio yang Anda instal.
  2. Salin file assembly SampleRules.dll dari direktori output ke <Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensions direktori. Secara default, jalur file yang dikompilasi .dll adalah YourSolutionPath\YourProjectPath\bin\Debug atau YourSolutionPath\YourProjectPath\bin\Release.

Catatan

Anda mungkin harus membuat Extensions direktori.

Aturan Anda sekarang harus diinstal dan muncul setelah Anda memulai ulang Visual Studio. Selanjutnya, mulai sesi baru Visual Studio dan buat proyek database.

Langkah 5.2: Memulai sesi Visual Studio baru dan membuat proyek database

  1. Mulai sesi kedua Visual Studio.
  2. Pilih File>Baru>Proyek.
  3. Dalam kotak dialog Proyek Baru, temukan dan pilih Proyek Basis Data SQL Server.
  4. Dalam kotak teks Nama , ketik SampleRulesDB dan pilih OK.

Langkah 5.3: Aktifkan aturan Analisis Kode AvoidWaitForRule

  1. Di Penjelajah Solusi, pilih SampleRulesDB proyek.
  2. Pada menu Proyek, pilih Properti. Halaman SampleRulesDB properti ditampilkan.
  3. Pilih Analisis Kode. Anda akan melihat kategori baru bernama RuleSamples.CategorySamples.
  4. Perbesar RuleSamples.CategorySamples. Anda seharusnya melihat SR1004: Avoid WAITFOR DELAY statement in stored procedures, triggers, and functions.
  5. Aktifkan aturan ini dengan memilih kotak centang di samping nama aturan dan kotak centang untuk Mengaktifkan analisis kode pada build. Untuk informasi selengkapnya tentang mengaktifkan analisis kode, periksa Gambaran umum analisis kode.
  6. Ketika tindakan build proyek digunakan, aturan akan dijalankan dan setiap pernyataan yang WAITFOR DELAY ditemukan akan dilaporkan sebagai peringatan.

Untuk menginstal aturan yang akan berjalan saat Anda membuat proyek SQL asli dengan Visual Studio, Anda harus menyalin rakitan dan file terkait .pdb ke folder Ekstensi.

Langkah 5.1: Instal rakitan SampleRules

  1. Selanjutnya, salin informasi perakitan ke direktori Ekstensi. Saat Visual Studio dimulai, Visual Studio mengidentifikasi ekstensi apa pun di <Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensions direktori dan subdirektori, dan membuatnya tersedia untuk digunakan. Untuk Visual Studio 2022, <Visual Studio Install Dir> biasanya C:\Program Files\Microsoft Visual Studio\2022\Enterprise. Ganti Enterprise dengan Professional atau Community bergantung pada edisi Visual Studio yang terinstal.
  2. Salin file assembly SampleRules.dll dari direktori output ke <Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensions direktori. Secara default, jalur file yang dikompilasi .dll adalah YourSolutionPath\YourProjectPath\bin\Debug atau YourSolutionPath\YourProjectPath\bin\Release.

Catatan

Anda mungkin harus membuat Extensions direktori.

Aturan Anda sekarang harus diinstal dan muncul setelah Anda memulai ulang Visual Studio. Selanjutnya, mulai sesi baru Visual Studio dan buat proyek database.

Langkah 5.2: Memulai sesi Visual Studio baru dan membuat proyek database

  1. Mulai sesi kedua Visual Studio.
  2. Pilih File>Baru>Proyek.
  3. Di dalam kotak dialog Proyek Baru, temukan dan pilih Proyek Database SQL Server, gaya-SDK (pratinjau).
  4. Dalam kotak teks Nama , ketik SampleRulesDB dan pilih OK.

Langkah 5.3: Aktifkan aturan Analisis Kode AvoidWaitForRule

  1. Di Penjelajah Solusi, pilih SampleRulesDB proyek.
  2. Klik dua kali simpul proyek untuk membuka file proyek. File SampleRulesDB proyek ditampilkan di editor teks.
  3. Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur RunSqlCodeAnalysis properti ke true.
  4. Ketika tindakan build proyek digunakan, aturan akan dijalankan dan setiap WAITFOR DELAY pernyataan yang ditemukan akan dilaporkan sebagai peringatan.

Langkah 5.1: Tempatkan rakitan SampleRules di sumber NuGet lokal

  1. Jika Anda tidak memiliki sumber lokal untuk paket NuGet, tambahkan folder di komputer lokal Anda untuk menyimpan paket NuGet untuk pengujian lokal. Anda dapat memeriksa sumber NuGet Anda saat ini dengan menjalankan perintah berikut:
dotnet nuget list source
  1. Jika sumber lokal tidak tercantum, Anda dapat menambahkannya menggunakan perintah berikut, mengganti <local folder path> dengan jalur ke folder lokal Anda seperti C:\NuGetPackages atau ~/NuGetPackages:
dotnet nuget add source <local folder path>
  1. SampleRules.dll Salin file rakitan dari direktori output ke direktori sumber NuGet lokal. Secara default, jalur file yang dikompilasi .dll adalah YourSolutionPath\YourProjectPath\bin\Debug atau YourSolutionPath\YourProjectPath\bin\Release.

Langkah 5.2: Menggunakan SampleRules dalam proyek database

  1. Buat proyek Microsoft.Build.Sql baru atau buka proyek yang sudah ada.
  2. Tambahkan referensi paket ke paket SampleRules NuGet dalam file proyek. Contoh berikut menunjukkan cara menambahkan referensi ke paket SampleRules NuGet dalam .sqlproj file:
<ItemGroup>
  <PackageReference Include="SampleRules" Version="1.0.0" />
</ItemGroup>

Langkah 5.3: Mengaktifkan analisis kode pada build

  1. Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur RunSqlCodeAnalysis properti ke true. Paket SampleRules NuGet akan dipulihkan saat proyek dibangun dan disertakan secara default.
  2. Ketika tindakan build proyek digunakan, aturan akan dijalankan dan pernyataan apa pun yang WAITFOR DELAY ditemukan akan dilaporkan sebagai peringatan.

Langkah 5.1: Tempatkan rakitan SampleRules di sumber NuGet lokal

  1. Jika Anda tidak memiliki sumber lokal untuk paket NuGet, tambahkan folder di komputer lokal Anda untuk menyimpan paket NuGet untuk pengujian lokal. Anda dapat memeriksa sumber NuGet Anda saat ini dengan menjalankan perintah berikut:
dotnet nuget list source
  1. Jika sumber lokal tidak tercantum, Anda dapat menambahkannya menggunakan perintah berikut, mengganti <local folder path> dengan jalur ke folder lokal Anda seperti C:\NuGetPackages atau ~/NuGetPackages:
dotnet nuget add source <local folder path>
  1. SampleRules.dll Salin file rakitan dari direktori output ke direktori sumber NuGet lokal. Secara default, jalur file yang dikompilasi .dll adalah YourSolutionPath\YourProjectPath\bin\Debug atau YourSolutionPath\YourProjectPath\bin\Release.

Langkah 5.2: Menggunakan SampleRules dalam proyek database

  1. Buat proyek Microsoft.Build.Sql baru atau buka proyek yang sudah ada.
  2. Tambahkan referensi paket ke paket SampleRules NuGet dalam file proyek. Contoh berikut menunjukkan cara menambahkan referensi ke paket SampleRules NuGet dalam .sqlproj file:
<ItemGroup>
  <PackageReference Include="SampleRules" Version="1.0.0" />
</ItemGroup>

Langkah 5.3: Mengaktifkan analisis kode pada build

  1. Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur RunSqlCodeAnalysis properti ke true. Paket SampleRules NuGet akan dipulihkan saat proyek dibangun dan disertakan secara default.
  2. Ketika tindakan build proyek digunakan, aturan akan dijalankan dan pernyataan apa pun yang ditemukan WAITFOR DELAY akan dilaporkan sebagai peringatan.