Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: Database SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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:
- Buat proyek pustaka kelas, aktifkan penandatanganan untuk proyek tersebut, dan tambahkan referensi yang diperlukan.
- Buat dua kelas C# pembantu.
- Buat kelas aturan kustom C#.
- Bangun proyek pustaka kelas.
- 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.
- .NET 8 SDK
- Komunitas Visual Studio 2022, Profesional, atau Perusahaan
- Alat Data SQL Server, gaya SDK (pratinjau) diinstal di Visual Studio 2022
- Versi Visual Studio terinstal, yang mendukung pengembangan C# .NET.
- Proyek SQL Server yang berisi objek SQL Server.
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:
Buat proyek pustaka kelas C# (.NET Framework) bernama
SampleRules
.Ganti nama file
Class1.cs
menjadiAvoidWaitForDelayRule.cs
.Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Tambahkan lalu Referensi.
Pilih
System.ComponentModel.Composition
pada tab Assemblies\Frameworks .Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Kelola Paket NuGet. Temukan dan instal
Microsoft.SqlServer.DacFx
paket NuGet. Versi yang dipilih harus162.x.x
(misalnya162.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:
Buat proyek pustaka kelas C# (.NET Framework) bernama
SampleRules
.Ganti nama file
Class1.cs
menjadiAvoidWaitForDelayRule.cs
.Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Tambahkan lalu Referensi.
Pilih
System.ComponentModel.Composition
pada tab Assemblies\Frameworks .Di Penjelajah Solusi, klik kanan simpul proyek lalu pilih Kelola Paket NuGet. Temukan dan instal
Microsoft.SqlServer.DacFx
paket NuGet. Versi yang dipilih harus162.x.x
(misalnya162.2.111
) dengan Visual Studio 2022.
Selanjutnya, tambahkan kelas pendukung yang akan digunakan oleh aturan.
Mulai Visual Studio Code dan buka folder tempat Anda ingin membuat proyek.
Buka jendela Terminal di Visual Studio Code dengan memilih menu Tampilan, lalu Terminal.
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
Ubah ke
SampleRules
direktori:cd SampleRules
Tambahkan paket NuGet yang diperlukan:
dotnet add package Microsoft.SqlServer.DacFx
Selanjutnya, tambahkan kelas pendukung yang akan digunakan oleh aturan.
Buka perintah atau jendela terminal dan navigasikan ke folder tempat Anda ingin membuat proyek.
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
Ubah ke
SampleRules
direktori:cd SampleRules
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 .
Di Penjelajah Solusi, pilih
SampleRules
proyek.Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik
WaitForDelayVisitor.cs
lalu pilih tombol Tambahkan . FileWaitForDelayVisitor.cs
ditambahkan ke proyek di Penjelajah Solusi.
Di Penjelajah Solusi, pilih
SampleRules
proyek.Pada menu Proyek , pilih Tambahkan Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik
WaitForDelayVisitor.cs
lalu pilih tombol Tambahkan . FileWaitForDelayVisitor.cs
ditambahkan ke proyek di Penjelajah Solusi.
Buka tampilan Explorer di Visual Studio Code.
Buat file baru bernama
WaitForDelayVisitor.cs
diSampleRules
folder .
- Arahkan ke direktori
SampleRules
. - Buat file baru bernama
WaitForDelayVisitor.cs
.
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 {} }
Dalam deklarasi kelas, ubah pengubah akses menjadi internal dan dapatkan kelas dari
TSqlConcreteFragmentVisitor
:internal class WaitForDelayVisitor : TSqlConcreteFragmentVisitor {}
Tambahkan kode berikut untuk menentukan variabel Daftar anggota:
public IList<WaitForStatement> WaitForDelayStatements { get; private set; }
Tentukan konstruktor kelas dengan menambahkan kode berikut:
public WaitForDelayVisitor() { WaitForDelayStatements = new List<WaitForStatement>(); }
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 opsiDELAY
yang ditentukan ke dalam daftar pernyataanWAITFOR DELAY
. Kelas kunci yang dirujuk adalah WaitForStatement.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.
Di Penjelajah Solusi, pilih
SampleRules
proyek. Pada menu Proyek , pilih Tambahkan lalu Item Baru. Kotak dialog Tambahkan Item Baru akan muncul.Dalam daftar Templat terinstal, pilih Umum. Di panel detail, pilih File Sumber Daya.
Di Nama, ketik
RuleResources.resx
. Editor sumber daya muncul, tanpa sumber daya yang ditentukan.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}.
Pada menu File , pilih Simpan AturanResources.resx.
Di Penjelajah Solusi, pilih
SampleRules
proyek. Pada menu Proyek , pilih Tambahkan lalu Item Baru. Kotak dialog Tambahkan Item Baru akan muncul.Dalam daftar Templat terinstal, pilih Umum. Di panel detail, pilih File Sumber Daya.
Di Nama, ketik
RuleResources.resx
. Editor sumber daya muncul, tanpa sumber daya yang ditentukan.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}.
Pada menu File , pilih Simpan AturanResources.resx.
SampleRules
Di direktori, buat file baru bernamaRuleResources.resx
.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>
Simpan file
RuleResources.resx
.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>
Simpan file
SampleRules.csproj
.
SampleRules
Di direktori, buat file baru bernamaRuleResources.resx
.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>
Simpan file
RuleResources.resx
.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>
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.
Di Penjelajah Solusi, pilih
SampleRules
proyek.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.
Di Penjelajah Solusi, pilih
SampleRules
proyek.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.
- Navigasikan ke
SampleRules
direktori dalam tampilan Explorer di Visual Studio Code. - Buat file baru bernama
LocalizedExportCodeAnalysisRuleAttribute.cs
.
- Arahkan ke direktori
SampleRules
. - Buat file baru bernama
LocalizedExportCodeAnalysisRuleAttribute.cs
.
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.
Di Penjelajah Solusi, pilih
SampleRules
proyek.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 . FileSampleRuleConstants.cs
ditambahkan ke proyek di Penjelajah Solusi.
Di Penjelajah Solusi, pilih
SampleRules
proyek.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 . FileSampleRuleConstants.cs
ditambahkan ke proyek di Penjelajah Solusi.
- Navigasikan ke
SampleRules
direktori dalam tampilan Explorer di Visual Studio Code. - Buat file baru bernama
SampleRuleConstants.cs
.
- Arahkan ke direktori
SampleRules
. - Buat file baru bernama
SampleRuleConstants.cs
.
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"; } }
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
Di Penjelajah Solusi, pilih
SampleRules
proyek.Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik
AvoidWaitForDelayRule.cs
lalu pilih Tambahkan. FileAvoidWaitForDelayRule.cs
ditambahkan ke proyek di Penjelajah Solusi.
Di Penjelajah Solusi, pilih
SampleRules
proyek.Pada menu Proyek , pilih Tambahkan lalu Kelas. Kotak dialog Tambahkan Item Baru akan muncul. Dalam kotak teks Nama , ketik
AvoidWaitForDelayRule.cs
lalu pilih Tambahkan. FileAvoidWaitForDelayRule.cs
ditambahkan ke proyek di Penjelajah Solusi.
- Navigasikan ke
SampleRules
direktori dalam tampilan Explorer di Visual Studio Code. - Buat file baru bernama
AvoidWaitForDelayRule.cs
.
- Arahkan ke direktori
SampleRules
. - Buat file baru bernama
AvoidWaitForDelayRule.cs
.
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 {} }
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
AvoidWaitForDelayRule
Dapatkan kelas dariMicrosoft.SqlServer.Dac.CodeAnalysis.SqlCodeAnalysisRule
kelas dasar:public sealed class AvoidWaitForDelayRule : SqlCodeAnalysisRule
Tambah
LocalizedExportCodeAnalysisRuleAttribute
ke kelas Anda.LocalizedExportCodeAnalysisRuleAttribute
memungkinkan layanan analisis kode untuk menemukan aturan analisis kode kustom. Hanya kelas yang ditandai denganExportCodeAnalysisRuleAttribute
(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, danDescription
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, makaMicrosoft.SqlServer.Dac.CodeAnalysis.SqlRuleScope.Model
dapat digunakan sebagai gantinya.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 mencantumkanMicrosoft.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 }; }
Tambahkan penimpaan
Microsoft.SqlServer.Dac.CodeAnalysis.SqlAnalysisRule.Analyze
(Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleExecutionContext)
untuk metode , yang menggunakanMicrosoft.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.TSqlObject
dan TSqlFragment dari parameter konteks. KelasWaitForDelayVisitor
kemudian digunakan untuk mendapatkan daftar semuaWAITFOR 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); }
Dari menu File , pilih Simpan.
Langkah 4: Bangun pustaka kelas
- Pada menu Proyek, pilih Properti SampleRules.
- Pilih tab Penandatanganan .
- Pilih Tanda tangani rakitan.
- Di Pilih file kunci nama yang kuat, pilih <Baru>.
- Dalam kotak dialog Buat Kunci Nama Kuat, di Nama file kunci, ketik
MyRefKey
. - (opsional) Anda dapat menentukan kata sandi untuk file kunci nama yang kuat.
- Pilih OK.
- Pada menu Berkas, pilih Simpan Semua.
- Dari menu Buat, pilih Buat Solusi.
- Pada menu Proyek, pilih SampleRules Properties.
- Pilih tab Penandatanganan .
- Pilih Tanda tangani rakitan.
- Di Pilih file kunci nama yang kuat, pilih <Baru>.
- Dalam kotak dialog Buat Kunci Nama Kuat, di Nama file kunci, ketik
MyRefKey
. - (opsional) Anda dapat menentukan kata sandi untuk file kunci nama yang kuat.
- Pilih OK.
- Pada menu Berkas, pilih Simpan Semua.
- Dari menu Buat, pilih Buat Solusi.
Buka jendela Terminal di Visual Studio Code dengan memilih menu Tampilan , lalu Terminal.
Di Terminal, masukkan perintah berikut untuk membangun proyek:
dotnet build /p:Configuration=Release
Arahkan ke direktori
SampleRules
.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
- 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>
biasanyaC:\Program Files\Microsoft Visual Studio\2022\Enterprise
. GantiEnterprise
denganProfessional
atauCommunity
bergantung pada edisi Visual Studio yang Anda instal. - 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
adalahYourSolutionPath\YourProjectPath\bin\Debug
atauYourSolutionPath\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
- Mulai sesi kedua Visual Studio.
- Pilih File>Baru>Proyek.
- Dalam kotak dialog Proyek Baru, temukan dan pilih Proyek Basis Data SQL Server.
- Dalam kotak teks Nama , ketik
SampleRulesDB
dan pilih OK.
Langkah 5.3: Aktifkan aturan Analisis Kode AvoidWaitForRule
- Di Penjelajah Solusi, pilih
SampleRulesDB
proyek. - Pada menu Proyek, pilih Properti. Halaman
SampleRulesDB
properti ditampilkan. - Pilih Analisis Kode. Anda akan melihat kategori baru bernama
RuleSamples.CategorySamples
. - Perbesar
RuleSamples.CategorySamples
. Anda seharusnya melihatSR1004: Avoid WAITFOR DELAY statement in stored procedures, triggers, and functions
. - 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.
- 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
- 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>
biasanyaC:\Program Files\Microsoft Visual Studio\2022\Enterprise
. GantiEnterprise
denganProfessional
atauCommunity
bergantung pada edisi Visual Studio yang terinstal. - 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
adalahYourSolutionPath\YourProjectPath\bin\Debug
atauYourSolutionPath\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
- Mulai sesi kedua Visual Studio.
- Pilih File>Baru>Proyek.
- Di dalam kotak dialog Proyek Baru, temukan dan pilih Proyek Database SQL Server, gaya-SDK (pratinjau).
- Dalam kotak teks Nama , ketik
SampleRulesDB
dan pilih OK.
Langkah 5.3: Aktifkan aturan Analisis Kode AvoidWaitForRule
- Di Penjelajah Solusi, pilih
SampleRulesDB
proyek. - Klik dua kali simpul proyek untuk membuka file proyek. File
SampleRulesDB
proyek ditampilkan di editor teks. - Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur
RunSqlCodeAnalysis
properti ketrue
. - 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
- 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
- Jika sumber lokal tidak tercantum, Anda dapat menambahkannya menggunakan perintah berikut, mengganti
<local folder path>
dengan jalur ke folder lokal Anda sepertiC:\NuGetPackages
atau~/NuGetPackages
:
dotnet nuget add source <local folder path>
-
SampleRules.dll
Salin file rakitan dari direktori output ke direktori sumber NuGet lokal. Secara default, jalur file yang dikompilasi.dll
adalahYourSolutionPath\YourProjectPath\bin\Debug
atauYourSolutionPath\YourProjectPath\bin\Release
.
Langkah 5.2: Menggunakan SampleRules dalam proyek database
- Buat proyek Microsoft.Build.Sql baru atau buka proyek yang sudah ada.
- 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
- Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur
RunSqlCodeAnalysis
properti ketrue
. Paket SampleRules NuGet akan dipulihkan saat proyek dibangun dan disertakan secara default. - 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
- 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
- Jika sumber lokal tidak tercantum, Anda dapat menambahkannya menggunakan perintah berikut, mengganti
<local folder path>
dengan jalur ke folder lokal Anda sepertiC:\NuGetPackages
atau~/NuGetPackages
:
dotnet nuget add source <local folder path>
-
SampleRules.dll
Salin file rakitan dari direktori output ke direktori sumber NuGet lokal. Secara default, jalur file yang dikompilasi.dll
adalahYourSolutionPath\YourProjectPath\bin\Debug
atauYourSolutionPath\YourProjectPath\bin\Release
.
Langkah 5.2: Menggunakan SampleRules dalam proyek database
- Buat proyek Microsoft.Build.Sql baru atau buka proyek yang sudah ada.
- 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
- Aktifkan analisis kode pada build dalam file proyek SQL dengan mengatur
RunSqlCodeAnalysis
properti ketrue
. Paket SampleRules NuGet akan dipulihkan saat proyek dibangun dan disertakan secara default. - Ketika tindakan build proyek digunakan, aturan akan dijalankan dan pernyataan apa pun yang ditemukan
WAITFOR DELAY
akan dilaporkan sebagai peringatan.