# SQL Server'da Veritabanı Şeması Karşılaştırma: Ortamlar Arası Farkları Tespit Etmek

Test ortamı ile production arasında fark var mı? Staging'e atılan değişiklik production'da yok mu? Biri doğrudan production'a bir şeyler yapmış mı? Şema karşılaştırması bu soruların hepsini yanıtlar.

Neden Şema Karşılaştırması Gerekli? Zaman içinde ortamlar kayar. Test'te olan production'da yok. Ya da tam tersi, production'da olan test'te yok. Bu kayma iki kaynaktan gelir: ya değişiklik yönetimi eksik ve bazı değişiklikler sadece bir ortama yapılmış, ya da biri doğrudan production'a müdahale etmiş. Her iki durumda da karşılaştırma farkı ortaya çıkarır.

Basit Şema Karşılaştırma Sorgusu Linked Server varsa iki ortamı doğrudan karşılaştırabilirsiniz. sql-- Production'da olup test'te olmayan tablolar SELECT t.name AS TabloAdi, 'Production''da var, Test''te yok' AS Durum FROM Production\_DB.sys.tables t WHERE t.name NOT IN ( SELECT name FROM Test\_DB.sys.tables )

UNION ALL

\-- Test'te olup production'da olmayan tablolar SELECT t.name, 'Test''te var, Production''da yok' FROM Test\_DB.sys.tables t WHERE t.name NOT IN ( SELECT name FROM Production\_DB.sys.tables ); sql-- Kolon farklılıklarını tespit et SELECT 'Production' AS Ortam, t.name AS TabloAdi, c.name AS KolonAdi, tp.name AS VeriTipi, c.max\_length AS MaxUzunluk, c.is\_nullable AS NullIzin FROM Production\_DB.sys.tables t JOIN Production\_DB.sys.columns c ON t.object\_id = c.object\_id JOIN Production\_DB.sys.types tp ON c.user\_type\_id = tp.user\_type\_id

EXCEPT

SELECT 'Production', t.name, c.name, tp.name, c.max\_length, c.is\_nullable FROM Test\_DB.sys.tables t JOIN Test\_DB.sys.columns c ON t.object\_id = c.object\_id JOIN Test\_DB.sys.types tp ON c.user\_type\_id = tp.user\_type\_id;

Stored Procedure Karşılaştırması sql-- Stored procedure metinlerini karşılaştır SELECT p.name AS ProcedureAdi, CASE WHEN m\_prod.definition != m\_test.definition THEN 'Farklı' WHEN m\_test.definition IS NULL THEN 'Test''te yok' ELSE 'Aynı' END AS Durum FROM Production\_DB.sys.procedures p JOIN Production\_DB.sys.sql\_modules m\_prod ON p.object\_id = m\_prod.object\_id LEFT JOIN Test\_DB.sys.procedures p\_test ON p.name = p\_test.name LEFT JOIN Test\_DB.sys.sql\_modules m\_test ON p\_test.object\_id = m\_test.object\_id WHERE m\_prod.definition != ISNULL(m\_test.definition, '') OR m\_test.definition IS NULL ORDER BY p.name;

Karşılaştırmayı Otomatikleştirmek Bu sorguları haftalık çalışan bir SQL Agent Job'ına dönüştürün. Fark tespit edildiğinde e-posta bildirimi göndersin. Bu sayede ortamlar arası kayma sürekli izlenir. Fark oluştuğu anda haberdar olunur.

Fark Bulunduğunda Ne Yapılmalı? Her fark hemen sorun değil. Planlı bir deployment yapılmış ve henüz diğer ortama geçmemiş olabilir. Ama farkın kaynağı bilinmiyorsa araştırılmalı. Kayıt dışı bir değişiklik mi? Eksik kalan bir deployment adımı mı? Bu araştırma değişiklik yönetim sürecinin parçası olmalı.

Sonuç Şema karşılaştırması hem ortam kalitesini korur hem de yetkisiz değişiklikleri tespit eder. Düzenli yapıldığında değişiklik yönetiminin en güçlü desteklerinden biri haline gelir. Detaylı bilgi için: sqlchangeguard.com
