Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Bu kılavuzda SQL Server kod çözümleme kuralı oluşturmak için kullanılan adımlar gösterilmektedir. Bu kılavuzda oluşturulan kural, saklı yordamlarda, tetikleyicilerde ve işlevlerde WAITFOR DELAY komutlarından kaçınmak için kullanılır.
Bu kılavuzda, aşağıdaki adımları kullanarak statik kod analizi Transact-SQL için özel bir kural oluşturacaksınız:
- Bir sınıf kitaplığı projesi oluşturun, bu proje için imzalamayı etkinleştirin ve gerekli başvuruları ekleyin.
- İki yardımcı C# sınıfı oluşturun.
- C# özel kural sınıfı oluşturun.
- Sınıf kitaplığı projesini oluşturun.
- Yeni kod analizi kuralını yükleyin ve test edin.
Visual Studio (SQL Server Veri Araçları) yönergeleri dışında, kılavuz SDK stili SQL projelerine odaklanır.
Prerequisites
Bu kılavuzu tamamlamak için aşağıdaki bileşenlere ihtiyacınız vardır:
- SQL Server Veri Araçları'nı içeren ve C# .NET Framework geliştirmesini destekleyen bir Visual Studio sürümü yüklü.
- SQL Server nesneleri içeren bir SQL Server projesi.
- Veritabanı projesini dağıtabileceğiniz bir SQL Server örneği.
Bu kılavuz, SQL Server Veri Araçları'nın SQL Server özelliklerini zaten bilen kullanıcılara yöneliktir. Sınıf kitaplığı oluşturma, NuGet paketleri ekleme ve bir sınıfa kod eklemek için kod düzenleyicisini kullanma gibi Visual Studio kavramları hakkında bilgi sahibi olmanız gerekir.
Note
SDK stili SQL Server Veri Araçları'nın önizleme sınırlamaları nedeniyle, bu kılavuzu tamamlamak için birden çok Visual Studio yüklemesi gerekir. İlk yükleme sınıf kitaplığı projesini oluşturmak için, ikinci yükleme ise SDK stili sql veritabanı projesini oluşturmak için gereklidir.
- .NET 8 SDK
- Visual Studio 2022 Community, Professional veya Enterprise sürümü
- Visual Studio 2022'de yüklenen SDK tarzı (önizleme) SQL Server Veri Araçları
- Visual Studio'nun C# .NET geliştirmesini destekleyen bir sürümü yüklü.
- SQL Server nesneleri içeren bir SQL Server projesi.
Bu kılavuz, SQL Server Veri Araçları'nın SQL Server özelliklerini zaten bilen kullanıcılara yöneliktir. Sınıf kitaplığı oluşturma, NuGet paketleri ekleme ve bir sınıfa kod eklemek için kod düzenleyicisini kullanma gibi Visual Studio kavramları hakkında bilgi sahibi olmanız gerekir.
- SQL Veritabanı Projeleri uzantısını içeren Visual Studio Code'un yüklü bir sürümü.
- SQL nesneleri içeren bir SQL veritabanı projesi.
- .NET 8 SDK
- Önerilen: VS Code için C# Dev Kit uzantısı
Bu kılavuz, Visual Studio Code'daki SQL Veritabanı Projeleri uzantısını zaten bilen kullanıcılara yöneliktir. Sınıf kitaplığı oluşturma, paket ekleme ve kodu düzenlemek için kod düzenleyicisini kullanma gibi geliştirme kavramları hakkında bilgi sahibi olmanız gerekir.
- Visual Studio Code'daki dosya düzenleyicisi gibi bir metin düzenleyicisi.
- SQL nesneleri içeren bir SQL veritabanı projesi.
- .NET 8 SDK
Bu kılavuz, SQL projelerini zaten bilen kullanıcılara yöneliktir. Sınıf kitaplığı oluşturma, paket ekleme ve kodu düzenlemek için kod düzenleyicisini kullanma gibi geliştirme kavramları hakkında bilgi sahibi olmanız gerekir.
1. Adım: Sınıf kitaplığı projesi oluşturma
İlk olarak bir sınıf kitaplığı oluşturun. Sınıf kitaplığı projesi oluşturmak için:
adlı
SampleRulesbir C# (.NET Framework) sınıf kitaplığı projesi oluşturun.Dosyayı
Class1.csolarakAvoidWaitForDelayRule.csyeniden adlandırın.Çözüm Gezgini'nde proje düğümüne sağ tıklayın ve ardından Ekle'yi ve ardından Başvuru'ya tıklayın.
System.ComponentModel.Compositionsekmesinde öğesini seçin.Çözüm Gezgini'nde proje düğümüne sağ tıklayın ve ardından NuGet Paketlerini Yönet'i seçin. NuGet paketini bulun ve yükleyin
Microsoft.SqlServer.DacFx. Seçilen sürüm (örneğin162.x.x), Visual Studio 2022 ile olmalıdır162.2.111.
Ardından, kural tarafından kullanılacak destekleyici sınıflar ekleyin.
İlk olarak bir sınıf kitaplığı oluşturun. Sınıf kitaplığı projesi oluşturmak için:
adlı
SampleRulesbir C# (.NET Framework) sınıf kitaplığı projesi oluşturun.Dosyayı
Class1.csolarakAvoidWaitForDelayRule.csyeniden adlandırın.Çözüm Gezgini'nde proje düğümüne sağ tıklayın ve ardından Ekle'yi ve ardından Başvuru'ya tıklayın.
System.ComponentModel.Compositionsekmesinde öğesini seçin.Çözüm Gezgini'nde proje düğümüne sağ tıklayın ve ardından NuGet Paketlerini Yönet'i seçin. NuGet paketini bulun ve yükleyin
Microsoft.SqlServer.DacFx. Seçilen sürüm (örneğin162.x.x), Visual Studio 2022 ile olmalıdır162.2.111.
Ardından, kural tarafından kullanılacak destekleyici sınıflar ekleyin.
Visual Studio Code'u başlatın ve projeyi oluşturmak istediğiniz klasörü açın.
Görünüm menüsünü ve ardından Terminal'i seçerek Visual Studio Code'da bir Terminal penceresi açın.
Terminalde, yeni bir çözüm ve proje oluşturmak için aşağıdaki komutları girin:
dotnet new sln dotnet new classlib -n SampleRules -o SampleRules dotnet sln add SampleRules/SampleRules.csprojDizine
SampleRulesgeçincd SampleRulesGerekli NuGet paketini ekleyin:
dotnet add package Microsoft.SqlServer.DacFx
Ardından, kural tarafından kullanılacak destekleyici sınıflar ekleyin.
Bir komut istemi veya terminal penceresi açın ve projeyi oluşturmak istediğiniz klasöre gidin.
Terminalde, yeni bir çözüm ve proje oluşturmak için aşağıdaki komutları girin:
dotnet new sln dotnet new classlib -n SampleRules -o SampleRules dotnet sln add SampleRules/SampleRules.csprojDizine
SampleRulesgeçincd SampleRulesGerekli NuGet paketini ekleyin:
dotnet add package Microsoft.SqlServer.DacFx
2. Adım: Özel kural yardımcı sınıfları oluşturma
Kuralın kendisi için sınıfı oluşturmadan önce, projeye bir ziyaretçi sınıfı ve öznitelik sınıfı ekleyin. Bu sınıflar daha fazla özel kural oluşturmak için yararlı olabilir.
2.1. Adım: WaitForDelayVisitor sınıfını tanımlama
Tanımlamanız gereken ilk sınıf, WaitForDelayVisitor türetilen sınıfıdır. Bu sınıf modeldeki WAITFOR DELAY deyimlere erişim sağlar. Ziyaretçi sınıfları SQL Server tarafından sağlanan ScriptDom API'lerini kullanır. Bu API'de Transact-SQL kodu soyut söz dizimi ağacı (AST) olarak temsil edilir ve deyimler gibi WAITFOR DELAY belirli söz dizimi nesnelerini bulmak istediğinizde ziyaretçi sınıfları yararlı olabilir. Belirli bir nesne özelliği veya ilişkisiyle ilişkilendirilmediğinden, bu deyimleri nesne modelini kullanarak bulmak zor olabilir, ancak bunları ziyaretçi desenini ve ScriptDom API'sini kullanarak bulabilirsiniz.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Sınıf Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna
WaitForDelayVisitor.csyazın ve Ekle düğmesini seçin. DosyaWaitForDelayVisitor.cs, Çözüm Gezgini'nde projeye eklenir.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Sınıf Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna
WaitForDelayVisitor.csyazın ve Ekle düğmesini seçin. DosyaWaitForDelayVisitor.cs, Çözüm Gezgini'nde projeye eklenir.
Visual Studio Code'da Gezgin görünümünü açın.
klasöründe adlı
WaitForDelayVisitor.csSampleRulesyeni bir dosya oluşturun.
-
SampleRulesdizinine gidin. -
WaitForDelayVisitor.csadlı yeni bir dosya oluşturun.
WaitForDelayVisitor.csDosyayı açın ve içeriği aşağıdaki kodla eşleşecek şekilde güncelleştirin:using System.Collections.Generic; using Microsoft.SqlServer.TransactSql.ScriptDom; namespace SampleRules { class WaitForDelayVisitor {} }Sınıf bildiriminde, erişim değiştiricisini dahili olarak değiştirin ve
TSqlConcreteFragmentVisitorsınıfından türetin.internal class WaitForDelayVisitor : TSqlConcreteFragmentVisitor {}List üye değişkenini tanımlamak için aşağıdaki kodu ekleyin:
public IList<WaitForStatement> WaitForDelayStatements { get; private set; }Aşağıdaki kodu ekleyerek sınıf oluşturucuyu tanımlayın:
public WaitForDelayVisitor() { WaitForDelayStatements = new List<WaitForStatement>(); }ExplicitVisitAşağıdaki kodu ekleyerek yöntemini geçersiz kılın:public override void ExplicitVisit(WaitForStatement node) { // We are only interested in WAITFOR DELAY occurrences if (node.WaitForOption == WaitForOption.Delay) WaitForDelayStatements.Add(node); }Bu yöntem modeldeki
WAITFORdeyimleri ziyaret eder ve deyim listesineDELAYWAITFOR DELAYseçeneği belirtilen deyimleri ekler. Başvurulan anahtar sınıfı WaitForStatement'tır.Dosya menüsünde Kaydetseçin.
2.2. Adım: Kaynak dosyası ve üç kaynak dizesi ekleme
Ardından kural adını, kural açıklamasını ve kuralın kural yapılandırma arabiriminde görüneceği kategoriyi tanımlayan bir kaynak dosyası ekleyin.
Çözüm Gezgini'da projeyi seçin
SampleRules. Proje menüsünde Ekle'yi ve ardından Yeni Öğe'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir.Yüklü Şablonlar listesinde Genel'i seçin. Ayrıntılar bölmesinde Kaynaklar Dosyası'nı seçin.
Ad alanına yazın
RuleResources.resx. Kaynak düzenleyicisi görünür, ancak herhangi bir kaynak tanımlanmamıştır.Dört kaynak dizesini aşağıdaki gibi tanımlayın:
Name Value AvoidWaitForDelay_ProblemDescriptionWAITFOR DELAY statement was found in {0}.AvoidWaitForDelay_RuleNameAvoid using WaitFor Delay statements in stored procedures, functions and triggers.CategorySamplesSamplesCategoryCannotCreateResourceManagerCan't create ResourceManager for {0} from {1}.Dosya menüsünde Kuralı KaydetResources.resx'i seçin.
Çözüm Gezgini'da projeyi seçin
SampleRules. Proje menüsünde Ekle'yi ve ardından Yeni Öğe'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir.Yüklü Şablonlar listesinde Genel'i seçin. Ayrıntılar bölmesinde Kaynaklar Dosyası'nı seçin.
Ad alanına yazın
RuleResources.resx. Kaynak düzenleyicisi görünür, ancak herhangi bir kaynak tanımlanmamıştır.Dört kaynak dizesini aşağıdaki gibi tanımlayın:
Name Value AvoidWaitForDelay_ProblemDescriptionWAITFOR DELAY statement was found in {0}.AvoidWaitForDelay_RuleNameAvoid using WaitFor Delay statements in stored procedures, functions and triggers.CategorySamplesSamplesCategoryCannotCreateResourceManagerCan't create ResourceManager for {0} from {1}.Dosya menüsünde Kuralı KaydetResources.resx'i seçin.
dizininde
SampleRulesadlıRuleResources.resxyeni bir dosya oluşturun.RuleResources.resxDosyayı açın ve aşağıdaki kodu ekleyin:<?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>RuleResources.resxdosyasını kaydedin.SampleRules.csprojDosyayı açın ve aşağıdaki kodu ekleyerek projedeki kaynak içeriğini güncelleştirin ve ekleyin:<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>SampleRules.csprojdosyasını kaydedin.
dizininde
SampleRulesadlıRuleResources.resxyeni bir dosya oluşturun.RuleResources.resxDosyayı açın ve aşağıdaki kodu ekleyin:<?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>RuleResources.resxdosyasını kaydedin.SampleRules.csprojDosyayı açın ve aşağıdaki kodu ekleyerek projedeki kaynak içeriğini güncelleştirin ve ekleyin:<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>SampleRules.csprojdosyasını kaydedin.
2.3. Adım: LocalizedExportCodeAnalysisRuleAttribute sınıfını tanımlama
İkinci sınıf: LocalizedExportCodeAnalysisRuleAttribute.cs. Bu, çerçeve tarafından sağlanan yerleşik Microsoft.SqlServer.Dac.CodeAnalysis.ExportCodeAnalysisRuleAttribute bir uzantıdır ve bir kaynak dosyasından kuralınız tarafından kullanılan ve DisplayName okumasını Description destekler. Kurallarınızı birden çok dilde kullanmayı düşünüyorsanız, bu yararlı bir sınıftır.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Sınıf Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna
LocalizedExportCodeAnalysisRuleAttribute.csyazın ve Ekle düğmesini seçin. Dosya, Çözüm Gezgini'nde projeye eklenir.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Sınıf Ekle'yi seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna
LocalizedExportCodeAnalysisRuleAttribute.csyazın ve Ekle düğmesini seçin. Dosya, Çözüm Gezgini'nde projeye eklenir.
-
SampleRulesVisual Studio Code'da Gezgin görünümünde dizine gidin. -
LocalizedExportCodeAnalysisRuleAttribute.csadlı yeni bir dosya oluşturun.
-
SampleRulesdizinine gidin. -
LocalizedExportCodeAnalysisRuleAttribute.csadlı yeni bir dosya oluşturun.
Dosyayı açın ve içeriği aşağıdaki kodla eşleşecek şekilde güncelleştirin:
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; } } } }
2.4. Adım: SampleConstants sınıfını tanımlama
Ardından, kullanıcı arabiriminde kuralınızla ilgili bilgileri görüntülemek için Visual Studio tarafından kullanılan kaynak dosyasındaki kaynaklara başvuran bir sınıf tanımlayın.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Ekle'yi ve ardından Sınıf'ı seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna yazın ve
SampleRuleConstants.csdüğmesini seçin. DosyaSampleRuleConstants.cs, Çözüm Gezgini'nde projeye eklenir.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Ekle'yi ve ardından Sınıf'ı seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna yazın ve
SampleRuleConstants.csdüğmesini seçin. DosyaSampleRuleConstants.cs, Çözüm Gezgini'nde projeye eklenir.
-
SampleRulesVisual Studio Code'da Gezgin görünümünde dizine gidin. -
SampleRuleConstants.csadlı yeni bir dosya oluşturun.
-
SampleRulesdizinine gidin. -
SampleRuleConstants.csadlı yeni bir dosya oluşturun.
SampleRuleConstants.csdosyasını açın ve aşağıdaki using deyimlerini dosyaya ekleyin: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"; } }Dosya menüsünde Kaydetseçin.
3. Adım: Özel kural sınıfı oluşturma
Özel kod çözümleme kuralının kullanacağı yardımcı sınıfları ekledikten sonra, özel bir kural sınıfı oluşturun ve adını verin AvoidWaitForDelayRule.
AvoidWaitForDelayRule özel kural, saklı yordamlarda, tetikleyicilerde ve işlevlerde WAITFOR DELAY deyimlerinden kaçınmalarına yardımcı olmak için veritabanı geliştiricileri tarafından kullanılacaktır.
3.1. Adım: AvoidWaitForDelayRule sınıfını oluşturma
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Ekle'yi ve ardından Sınıf'ı seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna yazın
AvoidWaitForDelayRule.csve Ekle'yi seçin. DosyaAvoidWaitForDelayRule.cs, Çözüm Gezgini'nde projeye eklenir.
Çözüm Gezgini'da projeyi seçin
SampleRules.Proje menüsünde Ekle'yi ve ardından Sınıf'ı seçin. Yeni Öğe Ekle iletişim kutusu görüntülenir. Ad metin kutusuna yazın
AvoidWaitForDelayRule.csve Ekle'yi seçin. DosyaAvoidWaitForDelayRule.cs, Çözüm Gezgini'nde projeye eklenir.
-
SampleRulesVisual Studio Code'da Gezgin görünümünde dizine gidin. -
AvoidWaitForDelayRule.csadlı yeni bir dosya oluşturun.
-
SampleRulesdizinine gidin. -
AvoidWaitForDelayRule.csadlı yeni bir dosya oluşturun.
AvoidWaitForDelayRule.csdosyasını açın ve aşağıdaki using deyimlerini dosyaya ekleyin: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 {} }Sınıf bildiriminde
AvoidWaitForDelayRuleerişim değiştiricisini public olarak ayarlayın./// <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 AvoidWaitForDelayRuleAvoidWaitForDelayRulesınıfınıMicrosoft.SqlServer.Dac.CodeAnalysis.SqlCodeAnalysisRuletemel sınıftan türetin.public sealed class AvoidWaitForDelayRule : SqlCodeAnalysisRuleöğesini
LocalizedExportCodeAnalysisRuleAttributesınıfınıza ekleyin.LocalizedExportCodeAnalysisRuleAttributekod analizi hizmetinin özel kod çözümleme kurallarını bulmasına izin verir. Kod analizinde yalnızca birExportCodeAnalysisRuleAttribute(veya bundan devralan bir öznitelik) ile işaretlenmiş sınıflar kullanılabilir.LocalizedExportCodeAnalysisRuleAttribute, hizmet tarafından kullanılan bazı gerekli meta verileri sağlar. Bu kural için benzersiz bir kimlik, Visual Studio kullanıcı arabiriminde gösterilen bir görünen ad ve sorunları tanımlarken kuralınız tarafından kullanılabilecek birDescriptionad içerir.[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"; }RuleScope özelliği, bu kural belirli öğeleri analiz ettiğinden
Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleScope.Elementolmalıdır. Kural, modeldeki eşleşen her öğe için bir kez çağrılır. Modelin tamamınıMicrosoft.SqlServer.Dac.CodeAnalysis.SqlRuleScope.Modelanaliz etmek isterseniz bunun yerine kullanılabilir.Microsoft.SqlServer.Dac.CodeAnalysis.SqlAnalysisRule.SupportedElementTypesöğesini ayarlayan bir oluşturucu ekleyin. Bu, öğe düzeyindeki kurallar için gereklidir. Bu kuralın uygulandığı öğe türlerini tanımlar. Bu durumda kural saklı yordamlara, tetikleyicilere ve işlevlere uygulanır. sınıfı,Microsoft.SqlServer.Dac.Model.ModelSchemaçözümlenebilecek tüm kullanılabilir öğe türlerini listeler.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 }; }Microsoft.SqlServer.Dac.CodeAnalysis.SqlAnalysisRule.Analyze'yi giriş parametreleri olarak kullanan(Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleExecutionContext)Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleExecutionContextyöntemine bir geçersiz kılma ekleyin. Bu yöntem olası sorunların listesini döndürür.yöntemi bağlam parametresinden ,
Microsoft.SqlServer.Dac.Model.TSqlModelveMicrosoft.SqlServer.Dac.Model.TSqlObjectdeğerlerini alır. SınıfıWaitForDelayVisitordaha sonra modeldeki tümWAITFOR DELAYdeyimlerin listesini almak için kullanılır.Bu listedeki her WaitForStatement için bir
Microsoft.SqlServer.Dac.CodeAnalysis.SqlRuleProblemoluşturulur./// <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); }Dosya menüsünde Kaydet'i seçin.
4. Adım: Sınıf kitaplığını oluşturma
- Proje menüsünde SampleRules Özellikleri'ni seçin.
- İmzalama sekmesini seçin.
- Derlemeyi imzala seçeneğine tıklayın.
- Güçlü ad anahtarı dosyasında<Yeni>'yi seçin.
-
Tanımlayıcı Ad Anahtarı Oluştur iletişim kutusunda, Anahtar dosya adı alanına yazın
MyRefKey. - (isteğe bağlı) Tanımlayıcı ad anahtarı dosyanız için bir parola belirtebilirsiniz.
- Tamam'ı seçin.
- Dosya menüsünde Tümünü Kaydet seçeneğiniseçin.
- Derle menüsünde Çözüm Derle'yi seçin.
- Proje menüsünde SampleRules Özellikleri'ni seçin.
- İmzalama sekmesini seçin.
- Derlemeyi imzala seçeneğine tıklayın.
- Güçlü ad anahtarı dosyasında<Yeni>'yi seçin.
-
Tanımlayıcı Ad Anahtarı Oluştur iletişim kutusunda, Anahtar dosya adı alanına yazın
MyRefKey. - (isteğe bağlı) Tanımlayıcı ad anahtarı dosyanız için bir parola belirtebilirsiniz.
- Tamam'ı seçin.
- Dosya menüsünde Tümünü Kaydet seçeneğiniseçin.
- Derle menüsünde Çözüm Derle'yi seçin.
Görünüm menüsünü ve ardından Terminal'i seçerek Visual Studio Code'da Terminal penceresini açın.
Terminalde, projeyi oluşturmak için aşağıdaki komutu girin:
dotnet build /p:Configuration=Release
SampleRulesdizinine gidin.Projeyi oluşturmak için aşağıdaki komutu çalıştırın:
dotnet build /p:Configuration=Release
5. Adım: Yeni kod analizi kuralını yükleme ve test edin
Ardından, bir SQL veritabanı projesi oluşturduğunuzda yüklensin diye derlemeyi kurmanız gerekir.
Visual Studio ile özgün bir SQL projesi oluşturduğunuzda çalışacak bir kural yüklemek için derlemeyi ve ilişkili .pdb dosyayı Uzantılar klasörüne kopyalamanız gerekir.
Adım 5.1: SampleRules derlemesini yükleme
- Ardından, derleme bilgilerini Uzantılar dizinine kopyalayın. Visual Studio başladığında, dizin ve alt dizinlerdeki
<Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensionsuzantıları tanımlar ve bunları kullanıma hazır hale getirir. Visual Studio 2022 için genellikle<Visual Studio Install Dir>şeklindedirC:\Program Files\Microsoft Visual Studio\2022\Enterprise.Enterpriseöğesini, yüklediğiniz Visual Studio sürümüne bağlı olarakProfessionalveyaCommunityile değiştirin. -
SampleRules.dllDerleme dosyasını çıkış dizininden dizinine<Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensionskopyalayın. Varsayılan olarak, derlenmiş.dlldosyanızın yoluYourSolutionPath\YourProjectPath\bin\DebugveyaYourSolutionPath\YourProjectPath\bin\Releaseşeklindedir.
Note
Extensions dizinini oluşturmanız gerekebilir.
Kuralınız artık yüklü olmalıdır ve Visual Studio'yu yeniden başlattıktan sonra görünür. Ardından, yeni bir Visual Studio oturumu başlatın ve bir veritabanı projesi oluşturun.
5.2. Adım: Yeni bir Visual Studio oturumu başlatma ve veritabanı projesi oluşturma
- Visual Studio'nun ikinci oturumını başlatın.
- Dosya>Yeni>Proje’yi seçin.
- Yeni Proje iletişim kutusunda SQL Server Veritabanı Projesi'ni bulun ve seçin.
-
Ad metin kutusuna yazın
SampleRulesDBve Tamam'ı seçin.
5.3. Adım: AvoidWaitForRule Kod Analizi kuralını etkinleştirme
- Çözüm Gezgini'da projeyi seçin
SampleRulesDB. -
Proje menüsünde Özellikler'i seçin.
SampleRulesDBÖzellikler sayfası görüntülenir. -
Kod Analizi'ne tıklayın. adlı
RuleSamples.CategorySamplesyeni bir kategori görmeniz gerekir. - Genişlet
RuleSamples.CategorySamples. ifadesini görmenizSR1004: Avoid WAITFOR DELAY statement in stored procedures, triggers, and functionsgerekir. - Kural adının yanındaki onay kutusunu ve Derlemede kod analizini etkinleştir onay kutusunu seçerek bu kuralı etkinleştirin. Kod analizini etkinleştirme hakkında daha fazla bilgi için Kod analizine genel bakış bölümüne bakın.
- Proje derleme eylemi kullanıldığında kural yürütülür ve bulunan tüm
WAITFOR DELAYdeyimler uyarı olarak bildirilir.
Visual Studio ile özgün bir SQL projesi oluşturduğunuzda çalışacak bir kural yüklemek için derlemeyi ve ilişkili .pdb dosyayı Uzantılar klasörüne kopyalamanız gerekir.
Adım 5.1: SampleRules derlemesini yükleme
- Ardından, derleme bilgilerini Uzantılar dizinine kopyalayın. Visual Studio başladığında, dizin ve alt dizinlerdeki
<Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensionsuzantıları tanımlar ve bunları kullanıma hazır hale getirir. Visual Studio 2022 için genellikle<Visual Studio Install Dir>şeklindedirC:\Program Files\Microsoft Visual Studio\2022\Enterprise. Visual Studio sürümünüze bağlı olarakEnterpriseöğesiniProfessionalveyaCommunityile değiştirin. -
SampleRules.dllDerleme dosyasını çıkış dizininden dizinine<Visual Studio Install Dir>\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\Extensionskopyalayın. Varsayılan olarak, derlenmiş.dlldosyanızın yoluYourSolutionPath\YourProjectPath\bin\DebugveyaYourSolutionPath\YourProjectPath\bin\Releaseşeklindedir.
Note
Extensions dizinini oluşturmanız gerekebilir.
Kuralınız artık yüklü olmalıdır ve Visual Studio'yu yeniden başlattıktan sonra görünür. Ardından, yeni bir Visual Studio oturumu başlatın ve bir veritabanı projesi oluşturun.
5.2. Adım: Yeni bir Visual Studio oturumu başlatma ve veritabanı projesi oluşturma
- Visual Studio'nun ikinci oturumını başlatın.
- Dosya>Yeni>Proje’yi seçin.
- Yeni Proje iletişim kutusunda SQL Server Veritabanı Projesi, SDK stili (önizleme) öğesini bulun ve seçin.
-
Ad metin kutusuna yazın
SampleRulesDBve Tamam'ı seçin.
5.3. Adım: AvoidWaitForRule Kod Analizi kuralını etkinleştirme
- Çözüm Gezgini'da projeyi seçin
SampleRulesDB. - Proje dosyasını açmak için proje düğümüne çift tıklayın. Proje
SampleRulesDBdosyası bir metin düzenleyicisinde görüntülenir. - SQL proje dosyasındaki derlemede kod analizini etkinleştirmek için
RunSqlCodeAnalysisözelliğinitrueolarak ayarlayın. - Proje derleme eylemi kullanıldığında kural yürütülür ve bulunan tüm
WAITFOR DELAYdeyimler uyarı olarak bildirilir.
5.1. Adım: SampleRules derlemesini yerel bir NuGet kaynağına yerleştirme
- NuGet paketleri için yerel bir kaynağınız yoksa yerel makinenize yerel test için NuGet paketlerini depolamak üzere bir klasör ekleyin. Aşağıdaki komutu çalıştırarak geçerli NuGet kaynaklarınızı de kontrol edebilirsiniz:
dotnet nuget list source
- Yerel bir kaynak listelenmemişse,
<local folder path>öğesiniC:\NuGetPackagesveya~/NuGetPackagesgibi yerel klasörünüzün yoluyla değiştirerek aşağıdaki komutu kullanarak bir kaynak ekleyebilirsiniz:
dotnet nuget add source <local folder path>
-
SampleRules.dllDerleme dosyasını çıkış dizininden yerel NuGet kaynak dizinine kopyalayın. Varsayılan olarak, derlenmiş.dlldosyanızın yoluYourSolutionPath\YourProjectPath\bin\DebugveyaYourSolutionPath\YourProjectPath\bin\Releaseşeklindedir.
5.2. Adım: Veritabanı projesinde SampleRules kullanma
- Yeni bir Microsoft.Build.Sql projesi oluşturun veya var olan bir projeyi açın.
- Proje dosyasındaki SampleRules NuGet paketine bir paket başvurusu ekleyin. Aşağıdaki örnek,
.sqlprojdosyasına SampleRules NuGet paketine nasıl başvuru ekleneceğini göstermektedir.
<ItemGroup>
<PackageReference Include="SampleRules" Version="1.0.0" />
</ItemGroup>
5.3. Adım: Derlemede kod analizini etkinleştirme
- SQL proje dosyasındaki derlemede kod analizini etkinleştirmek için
RunSqlCodeAnalysisözelliğinitrueolarak ayarlayın. Proje oluşturulduğunda ve varsayılan olarak dahil edildiğinde SampleRules NuGet paketi geri yüklenir. - Proje derleme eylemi kullanıldığında kural yürütülür ve bulunan tüm
WAITFOR DELAYdeyimler uyarı olarak bildirilir.
5.1. Adım: SampleRules derlemesini yerel bir NuGet kaynağına yerleştirme
- NuGet paketleri için yerel bir kaynağınız yoksa yerel makinenize yerel test için NuGet paketlerini depolamak üzere bir klasör ekleyin. Aşağıdaki komutu çalıştırarak geçerli NuGet kaynaklarınızı de kontrol edebilirsiniz:
dotnet nuget list source
- Yerel bir kaynak listelenmemişse,
<local folder path>öğesiniC:\NuGetPackagesveya~/NuGetPackagesgibi yerel klasörünüzün yoluyla değiştirerek aşağıdaki komutu kullanarak bir kaynak ekleyebilirsiniz:
dotnet nuget add source <local folder path>
-
SampleRules.dllDerleme dosyasını çıkış dizininden yerel NuGet kaynak dizinine kopyalayın. Varsayılan olarak, derlenmiş.dlldosyanızın yoluYourSolutionPath\YourProjectPath\bin\DebugveyaYourSolutionPath\YourProjectPath\bin\Releaseşeklindedir.
5.2. Adım: Veritabanı projesinde SampleRules kullanma
- Yeni bir Microsoft.Build.Sql projesi oluşturun veya var olan bir projeyi açın.
- Proje dosyasındaki SampleRules NuGet paketine bir paket başvurusu ekleyin. Aşağıdaki örnek,
.sqlprojdosyasına SampleRules NuGet paketine nasıl başvuru ekleneceğini göstermektedir.
<ItemGroup>
<PackageReference Include="SampleRules" Version="1.0.0" />
</ItemGroup>
5.3. Adım: Derlemede kod analizini etkinleştirme
- SQL proje dosyasındaki derlemede kod analizini etkinleştirmek için
RunSqlCodeAnalysisözelliğinitrueolarak ayarlayın. Proje oluşturulduğunda ve varsayılan olarak dahil edildiğinde SampleRules NuGet paketi geri yüklenir. - Proje derleme eylemi kullanıldığında kural yürütülür ve bulunan tüm
WAITFOR DELAYdeyimler uyarı olarak bildirilir.
İlgili içerik
- Kod kalitesini geliştirmek için SQL kod analizini
- Kod analizi kuralları genişletilebilirliğine genel bakış
- hataları bulmak için T-SQL kodunu analiz