qlity

SQL Server → C#

Veritabanında hapis kalan iş mantığını koda taşıyın. Kanıtıyla.

qlity, stored procedure'larınızı envanterler, okunabilir C# koduna çevirir ve yeni kodun eski prosedürle aynı satırları döndürdüğünü, aynı satırları yazdığını çalıştırarak kanıtlar. Tahmin değil, fark raporu.

stored procedure
CREATE PROCEDURE dbo.OrdersByNote
    @note varchar(20)
AS
SELECT Id, Total
FROM dbo.Orders
WHERE Note = @note
üretilen kod · EF Core
note = ProcedureParameters.AsVarChar(note, 20, 1252);

return await (
    from orders in db.Orders
    where (orders.Note != null && note != null
           && orders.Note == note)
    select new OrdersByNoteRow
    {
        Id = orders.Id,
        Total = orders.Total
    }).ToListAsync(cancellationToken);

eşdeğer — prosedüre karşı koşturuldu, NULL parametre dahil

Problem

Kod tabanınızın bir kısmı kodda değil.

On yıllık bir .NET ve SQL Server sisteminde binlerce stored procedure olağan. İş kuralları oraya kaçmış, oradan çıkamıyor.

Görünmez

Code review yok, unit test yok, gerçek versiyonlama yok. Kural veritabanında yaşıyor ve kimse ne yaptığını tam bilmiyor.

Silinemez

Hangi prosedürü kimin çağırdığı belli değil. Ölüleri de canlıları da kimse silmeye cesaret edemiyor.

Duvar

Buluta ya da başka bir veritabanına geçiş, servislere ayırma, ORM'e dönüş: hepsi aynı duvara çarpıyor.

Yapay zekâya kör

Kod asistanları görmedikleri koda dokunamaz. İş mantığının yarısı veritabanındaysa, yatırımın yarısı ıskalıyor.

Nasıl çalışır

Önce gör, sonra kanıtla, sonra taşı.

Dört katman, her biri tek başına işe yarar. Hiçbiri veritabanınızı değiştirmez; kanıt, sizin işaretlediğiniz tek kullanımlık bir kopyada koşar.

  1. 01çalışıyor

    Envanter

    Neyin nerede olduğunu görün

    Bütün prosedür, view, fonksiyon ve trigger'lar; kaynak koddaki çağrı yerleri; bağımlılık grafiği ve ölü kod. Paylaşılabilir bir risk haritası olarak.

  2. 02çalışıyor

    Kanıt

    Eskisiyle aynı mı, ölçün

    Prosedürü ve yerine geçen kodu aynı çağrılarla, aynı başlangıç durumundan çalıştırır; döndürdüklerini ve yazdıklarını satır satır karşılaştırır.

  3. 03genişliyor

    Göç

    Okunabilir koda çevirin

    Gövde LINQ olarak EF Core'a ya da SQL olarak Dapper'la koda taşınır; çıktı sizin şablonlarınızla, sizin kod stilinizde üretilir. Çeviremediğini gerekçesiyle söyler.

  4. 04planlanıyor

    Koruma

    Geri kaymasın

    Taşınan prosedürün geri dirilmesini, yenilerinin eklenmesini ve kodla veritabanının ayrışmasını CI'da yakalar.

Demo

Bir prosedür yazın, ne üretildiğine bakın.

Tablolarınızı CREATE TABLE ile, prosedürünüzü CREATE PROCEDURE ile yazın ya da yapıştırın. Çeviriyi ürünün kendi motoru yapar: yazdığınız yalnızca çevrilmek için gönderilir; çalıştırılmaz, saklanmaz, kaydedilmez.

Örnekler
T-SQL

Çevirmek için soldaki script'i düzenleyin ya da bir örnek seçin.

Demo kanıt çalıştırmaz: kanıt, prosedürü ve yeni kodu bir veritabanında koşturmayı gerektirir. Şemalar sunucu yerine CREATE TABLE'lardan okunur; varsayılan collation Latin1.

Kanıt

Eşdeğer demek, veritabanı açısından ayırt edilemez demek.

Yakın değil, aynı. Kurallar tek tek gerekçelendirilir ve testleri geçirmek için gevşetilmez; bir farkı gizlemektense yanlış alarm vermeyi seçer.

NULL, SQL'deki gibi

T-SQL'de NULL ile karşılaştırma ne doğru ne yanlıştır. Üretilen LINQ her koşulu bu üç değerli mantıkla yazar; C#'ın iki değerli mantığına bırakmaz.

Parametre, prosedürün tipinde

Prosedür gelen değeri sessizce kendi tipine çevirir: varchar(4) kırpar, datetime yuvarlar. Üretilen kod aynısını, sunucuyla ölçülerek yapar.

Saat ve yeni kimlikler

GETDATE() iki çalıştırmada aynı olamaz; kendi çalıştırmasının penceresinde olmalıdır. NEWID() ile üretilen kimlikler birebir eşlenmelidir.

Hata da davranıştır

Aynı girdiyi aynı şekilde reddetmek gerekir. Hatadan sonra devam eden prosedürün karşılığı da devam eder, duran da durur.

Açık bir şema üzerinde ölçüldü

601 / 602

Dapper: eşdeğer

tek fark bilinen bir yanlış alarm

575 / 575

EF Core: eşdeğer

yazan 303'ü tablo durumuyla birlikte

DNN Platform'un 682 stored procedure'ü, üretilen her metot kendi prosedürüne karşı, tek kullanımlık bir kopyada. Rakamlar depo içindeki ölçüm betikleriyle yeniden üretilebilir.

SSS

Sık sorulanlar

Hangi veritabanları ve hedefler destekleniyor?

Bugün SQL Server'dan C#'a: EF Core (mantık LINQ'e taşınır) ve Dapper (SQL kodda kalır). Çıktı şablonlarla üretilir; kendi repository katmanınıza, kendi kod stilinize göre uyarlanabilir.

Çeviremediği prosedürler ne olacak?

Çevirmez ve nedenini söyler: hangi yapı, hangi satırda. Yakın bir şey üretip geçmek yok. Envanter bu listeyi baştan gösterir, efor tahmini buna göre yapılır.

Verilerimiz dışarı çıkıyor mu?

Hayır. qlity sizin ortamınızda çalışır. Kanıt, sizin işaretlediğiniz tek kullanımlık bir kopya üzerinde koşar; üretim veritabanına yazmaz.

Kanıt için çağrılar nereden geliyor?

Üretimden: SQL Server'ın Extended Events'iyle, seçtiğiniz prosedürlere gelen gerçek çağrılar toplanır ve her biri iki tarafta da koşturulur.

Hepsini birden mi taşımamız gerekiyor?

Hayır. Her prosedür tek başına taşınır ve kanıtlanır; eski çağrı imzası korunarak kademeli geçiş planlanıyor. Her adım geri alınabilir.

İletişim

Prosedürlerinize birlikte bakalım.

Kaç prosedürünüz var, neyi taşımak istiyorsunuz, sizi ne durduruyor: birkaç satır yeter. 1-2 iş günü içinde dönüyoruz.

info@qlity.io

Yazdıklarınız yalnızca size dönmek için kullanılır; üçüncü taraflarla paylaşılmaz, pazarlama listesine eklenmez.