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.
SQL Server → C#
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.
CREATE PROCEDURE dbo.OrdersByNote
@note varchar(20)
AS
SELECT Id, Total
FROM dbo.Orders
WHERE Note = @notenote = 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
On yıllık bir .NET ve SQL Server sisteminde binlerce stored procedure olağan. İş kuralları oraya kaçmış, oradan çıkamıyor.
Code review yok, unit test yok, gerçek versiyonlama yok. Kural veritabanında yaşıyor ve kimse ne yaptığını tam bilmiyor.
Hangi prosedürü kimin çağırdığı belli değil. Ölüleri de canlıları da kimse silmeye cesaret edemiyor.
Buluta ya da başka bir veritabanına geçiş, servislere ayırma, ORM'e dönüş: hepsi aynı duvara çarpıyor.
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
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.
Envanter
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.
Kanıt
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.
Göç
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.
Koruma
Taşınan prosedürün geri dirilmesini, yenilerinin eklenmesini ve kodla veritabanının ayrışmasını CI'da yakalar.
Demo
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.
Ç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
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.
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.
Prosedür gelen değeri sessizce kendi tipine çevirir: varchar(4) kırpar, datetime yuvarlar. Üretilen kod aynısını, sunucuyla ölçülerek yapar.
GETDATE() iki çalıştırmada aynı olamaz; kendi çalıştırmasının penceresinde olmalıdır. NEWID() ile üretilen kimlikler birebir eşlenmelidir.
Aynı girdiyi aynı şekilde reddetmek gerekir. Hatadan sonra devam eden prosedürün karşılığı da devam eder, duran da durur.
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
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.
Ç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.
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.
Ü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.
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
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.
Yazdıklarınız yalnızca size dönmek için kullanılır; üçüncü taraflarla paylaşılmaz, pazarlama listesine eklenmez.