İçeriğe atla
Şimdi yükleniyor
AKAşkın KILIÇ
  • Anasayfa
  • Azure & Bulut
    • Microsoft Azure
    • Bulut Altyapı
    • Microsoft 365
  • Yazılım
    • DevOps
    • Geliştirici Araçları
    • Konteyner & K8s
  • AI & Veri
    • Yapay Zeka
    • Veri & Analitik
  • Güvenlik
    • Güvenlik & Kimlik
    • Kurumsal Teknoloji
  • Hakkımda
    • İletişim
×
  • Azure
  • Bulut Altyapı
  • DevOps
  • Geliştirici Araçları
  • Güvenlik & Kimlik
  • Konteyner & Kubernetes
  • Kurumsal Teknoloji
  • Microsoft 365
  • Microsoft Azure
  • Veri & Analitik
  • Yapay Zeka
  • Başlangıç
  • DevOps
  • Kesintisiz Şema Değişikliği İçin 6 Aşamalı Yol
Bulut Altyapı DevOps Azure SQL, Çift Yazma, Expand-and-Contract, Query Store, Şema Değişikliği Aşkın KILIÇ 06/09/2026 2 Yorumlar

Kesintisiz Şema Değişikliği İçin 6 Aşamalı Yol

Kesintisiz Şema Değişikliği İçin 6 Aşamalı Yol
📑 İçindekiler
  1. Örnek: Name Alanını İkiye Ayırmak
  2. 1. Aşama: Yeni Sütunları Ekleyin
  3. 2. Aşama: Eski ve Yeni Sütunlara Birlikte Yazın
  4. 3. Aşama: Mevcut Satırları Doldurun
  5. 4. Aşama: Okumaları Yeni Sütunlara Taşıyın
  6. 5. Aşama: Name Sütununa Yazmayı Bırakın
  7. 6. Aşama: Doğrulayın ve Eski Şemayı Kaldırın
  8. Sonuç: Asıl Değer Sıralamada
  9. İlgili İçerikler
  10. Kaynaklar ve İleri Okuma

⏱️ 5 dk okuma📅 6 Eylül 2026

Veritabanı şeması zamanla değişir. Gereksinimler olgunlaşır, ürünler gelişir, işletmeler birleşir, yeni sistemlerle bütünleşir veya farklı pazarlara açılır. Sorun, bu değişikliği veritabanına bağlı uygulamaları ve kullanıcıları kesintiye uğratmadan yapmaktır.

Azure SQL için önerilen yöntem, değişikliği tek seferde yapmak yerine aşamalara ayırmaktır. “Expand-and-contract” adı verilen bu yöntemde önce yeni yapı eklenir, eski ve yeni yapılar bir süre birlikte çalışır, ardından eski yapı kaldırılır.

Örnek: Name Alanını İkiye Ayırmak

Bir User tablosundaki Name alanını FirstName ve LastName olarak ayırmak istediğinizi düşünün. Son hedef basit görünür, ancak üretim ortamına güvenli biçimde ulaşmak için eski ve yeni uygulama sürümlerinin bir süre birlikte çalışabilmesi gerekir.

Bu yüzden değişiklik; yeni sütunların eklenmesi, iki yapıya birlikte yazılması, eski verilerin doldurulması, okumaların taşınması, eski sütuna yazmanın bırakılması ve son olarak eski şemanın kaldırılması şeklinde ilerler.

1. Aşama: Yeni Sütunları Ekleyin

İlk adım, mevcut uygulamanın kullandığı yapıya dokunmadan yeni sütunları eklemektir:

ALTER TABLE dbo.[User]
ADD
FirstName nvarchar(100) NULL,
LastName  nvarchar(100) NULL;

Bu aşamada Name sütunu olduğu gibi kalır. Mevcut uygulama örnekleri bu sütunu okumayı ve yazmayı sürdürür. Yeni sütunlar sonraki aşamaları bekler.

Yeni sütunların NULL kabul etmesi bilinçli bir tercihtir. Mevcut satırlarda henüz bu alanlara ait değer bulunmadığı için ilk anda zorunlu değer istemek, basit bir ekleme işlemini veri taşıma sorununa çevirebilir.

Sıralama burada önemlidir: Önce veritabanı değişikliği dağıtılmalı, tüm üretim veritabanları hem eski hem de yeni şemayı tanıdıktan sonra uygulama kodu güncellenmelidir.

2. Aşama: Eski ve Yeni Sütunlara Birlikte Yazın

Veritabanı iki yapıyı da desteklemeye başladığında uygulama, kullanıcı adını üç sütuna birlikte yazabilir:

user.Name = $"{user.FirstName} {user.LastName}";
user.FirstName = firstName;
user.LastName = lastName;

Her ekleme veya güncelleme işleminde Name, FirstName ve LastName değerleri aynı anda güncel tutulmalıdır. Böylece eski uygulama örnekleri Name alanını okumayı sürdürürken yeni uygulama örnekleri yeni sütunları kullanabilir.

Yeni sütunlardan okumaya geçmeden önce çift yönlü yazma başlatılmalıdır. Mevcut satırlar henüz doldurulmadığı için FirstName ve LastName değerleri NULL olabilir. Çift yazma, bu aşamadan sonra değiştirilen verilerin iki temsilinde de güncel kalmasını sağlar.

Senkronizasyon için tetikleyici kullanılabilir, ancak mümkünse geçiş mantığını uygulamada tutmak daha uygundur. Uygulama değişikliğin anlamını bildiği için mantık görünür kalır ve geçiş tamamlandığında kaldırılması kolaylaşır. Birden fazla uygulama doğrudan tabloya yazıyor ve hepsini aynı anda güncellemek mümkün değilse tetikleyici uygun bir seçenek olabilir.

Yazma işlemleri zaten saklı yordamlar üzerinden yürüyorsa bu yordamları güncellemek de pratik bir yoldur. Yordam yeni alanları kabul edip eski Name alanını doldurmaya devam edebilir. Ancak yalnızca geçişi kolaylaştırmak için yeni bir soyutlama katmanı eklemek, daha sonra dağıtılması ve kaldırılması gereken ek bir yapı yaratır.

3. Aşama: Mevcut Satırları Doldurun

Yeni yazmalar iki temsili de güncel tuttuktan sonra, geçişten önce var olan satırlar doldurulabilir:

UPDATE dbo.[User]
SET
FirstName = LEFT(Name, CHARINDEX(' ', Name + ' ') - 1),
LastName = LTRIM(SUBSTRING(
Name,
CHARINDEX(' ', Name + ' ') + 1,
LEN(Name)
))
WHERE FirstName IS NULL
OR LastName IS NULL;

Bu örnekteki ad ayrıştırma mantığı basittir. Gerçek adlarda ön ekler, son ekler, birleşik soyadları, tek kelimelik adlar ve farklı adlandırma biçimleri bulunabilir. Bu nedenle dönüşüm mantığı ayrıca doğrulanmalı, her durumda T-SQL ile uygulanmasının uygun olmayabileceği göz önünde bulundurulmalıdır.

Üretimde bir başka konu da tek seferde ne kadar verinin güncelleneceğidir. Büyük bir UPDATE işlemi kilitleri uzun süre tutabilir, işlem günlüğünü büyütebilir ve sistemi gereksiz yere zorlayabilir. Büyük tablolar için işlem parçalar halinde yürütülebilir:

WHILE 1 = 1
BEGIN
UPDATE TOP (1000) dbo.[User]
SET
FirstName = LEFT(Name, CHARINDEX(' ', Name + ' ') - 1),
LastName = LTRIM(SUBSTRING(
Name,
CHARINDEX(' ', Name + ' ') + 1,
LEN(Name)
))
WHERE FirstName IS NULL
OR LastName IS NULL;
IF @@ROWCOUNT = 0
BREAK;
END

Çift yazmanın önce başlatılması, geçmiş satırlar doldurulurken yeni eklenen veya güncellenen satırların iki temsilde de korunmasını sağlar. Bu işlem için uygulamayı durdurmak gerekmez.

4. Aşama: Okumaları Yeni Sütunlara Taşıyın

Tüm satırlardaki yeni alanlar doldurulup yeni yazmalar bu alanları güncel tuttuğunda, uygulama okumaları yeni şemaya taşınabilir:

SELECT
Id,
FirstName,
LastName,
Email
FROM dbo.[User];

Bu adım bir temizlik işi gibi görülmemeli, ayrı bir dağıtım aşaması olarak ele alınmalıdır. Eski uygulama örnekleri veya başka tüketiciler hâlâ Name sütununa bağlı olabilir. Bu nedenle okumalar kademeli olarak taşınmalı ve geçiş sırasında ortaya çıkan sorunlar izlenmelidir.

Aşamalı dağıtım, canary dağıtımı veya özellik bayrakları destekleniyorsa bu aşamada kullanılabilir. Yeni ve eski uygulama biçimleri aynı anda veritabanı tarafından desteklendiği için tüm tüketicileri tek seferde değiştirmek gerekmez.

Name sütununa ait okuma izinlerini hemen kaldırmak, bağımlılıkları keşfetmek için riskli bir yoldur. Raporlar, işler, betikler veya eski uygulama örnekleri hâlâ bu alanı kullanıyor olabilir. Daha güvenli yol, kullanımı gözlemlemek, bilinen tüketicileri güncellemek ve bağımlılıkların sona erdiğinden emin olana kadar eski sütunu okunabilir bırakmaktır.

Query Store, eski sütuna referans veren yakın tarihli sorguları bulmak için başlangıç noktası olabilir. Uygulama günlükleri, veritabanı günlükleri, bağımlılık bilgileri ve geçici Extended Events kullanımı da yardımcı olur. Tek bir yöntem tüm tüketicileri göstermeyebileceği için ortamda uygun araçlar birlikte değerlendirilmelidir.

Uygulamanın yanı sıra raporlar, ETL işleri, dışa aktarımlar, betikler, zamanlanmış işler, not defterleri ve alt sistemler de kontrol edilmelidir.

5. Aşama: Name Sütununa Yazmayı Bırakın

Uygulama okumaları yeni sütunlara taşınıp diğer tüketicilerin geçişi için yeterli süre beklendikten sonra çift yazma mantığı kaldırılabilir:

user.FirstName = firstName;
user.LastName = lastName;

Bu noktada Name sütununun eski haliyle kalması beklenir. Ancak sütun henüz silinmemelidir. Bir süre daha yerinde bırakılması, uygulama, rapor, iş veya alt sistemlerin eski değer güncellenmeyi bıraktığında beklenmedik biçimde etkilenip etkilenmediğini görmeyi sağlar.

Buradaki ayrım önemlidir: Name silinmemiş, kullanımdan kaldırılmıştır. Yeni şemanın doğruluğu korunurken eski sütun bir uyumluluk arabelleği olarak tutulur.

6. Aşama: Doğrulayın ve Eski Şemayı Kaldırın

Son adımdan önce yeni durum doğrulanmalıdır. Beklenen satırlarda yeni alanların dolu olduğu kontrol edilmeli, beklenmeyen NULL değerleri incelenmeli, raporların ve alt sistemlerin yeni yapıya geçtiği doğrulanmalıdır. Yeni sütunlara ait son kısıtlar veya indeksler de bu aşamada eklenebilir.

Doğrulama tamamlandığında eski sütun kaldırılabilir:

ALTER TABLE dbo.[User]
DROP COLUMN Name;

Bu işlem, expand-and-contract yaklaşımının “contract” bölümüdür. Şema önce genişletilir, eski ve yeni yapılar birlikte çalıştırılır, yazmalar ve okumalar taşınır, veriler doldurulur, geçiş doğrulanır ve ancak bundan sonra eski yapı kaldırılır.

Geçiş doğru sırayla yapıldıysa sütunu kaldırma adımı sürpriz yaratmaz. Çünkü bu noktada hiçbir tüketicinin eski sütuna bağlı kalmaması gerekir.

Sonuç: Asıl Değer Sıralamada

Örnek yalnızca bir ad sütununun ayrıştırılmasını ele alıyor, ancak yöntem daha geniş şema değişikliklerinde de kullanılabilir. Önce yeni yapı eklenir, eski ve yeni temsiller birlikte çalıştırılır, yazmalar taşınır, mevcut veri doldurulur, okumalar güncellenir, eski yazmalar durdurulur ve son olarak eski yapı kaldırılır. Kesintisiz geçiş bu sıraya dayanır.

Tek tek SQL ifadeleri kolay olabilir. Zor olan, bunları doğru sırayla ve her aşamadaki uyumluluk gereksinimlerini gözeterek uygulamaktır.

İlgili İçerikler

  • PowerShell, OpenSSH ve DSC İçin 2026 Yol Haritası
  • Cosmos DB Rolleri: Uygulamam İçin Hangisi Doğru Seçim?
  • Azure DevOps’tan GitHub’a Kesintisiz Geçiş: ELM ile Yeni Dönem

Kaynaklar ve İleri Okuma

  • devblogs.microsoft.com
  • devblogs.microsoft.com
  • Azure SQL’de şema değişikliğinin altı aşamalı geçiş yaklaşımı
🤖Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ
Aşkın KILIÇYazar

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

İlgili Yazılar

Foundry Toolboxes: Ajan Araçlarını Toplamak Neden Şart Oldu?
Foundry Toolboxes: Ajan Araçlarını Toplamak Neden Şart Oldu?10 May 2026
ABD Devletine Açılan Sır Kapısı: Azure Top Secret Bulutta Yapay Zekâ ve Verinin Yeni Çağı
ABD Devletine Açılan Sır Kapısı: Azure Top Secret Bulutta Yapay Zekâ ve Verinin Yeni Çağı24 Mar 2026
Agent Governance Toolkit ile MCP Güvenliği: .NET’te Yeni Katman
Agent Governance Toolkit ile MCP Güvenliği: .NET’te Yeni Katman24 May 2026
Gemini API’de Maliyet ve Hız Dengesi: Flex ile Priority
Gemini API’de Maliyet ve Hız Dengesi: Flex ile Priority4 Nis 2026

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

YouTube GitHub

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

Etiket Azure SQL Çift Yazma Expand-and-Contract Query Store Şema Değişikliği
Önceki yazı

Fairwind Programı: Hükümetlere Sınırlı Siber Savunma

Sonraki yazı

Kurumsal Yapay Zekâda Azure’un Uçtan Uca Yaklaşımı

İlginizi Çekebilir

Azure DevOps Plugin ile Copilot'ta Backlog Yönetimi
Aşkın KILIÇ 0

Azure DevOps Plugin ile Copilot’ta Backlog Yönetimi

21/10/2026
Dependabot Alerts REST API Artık Sürüm Bilgisi Veriyor
Aşkın KILIÇ 0

Dependabot Alerts REST API Artık Sürüm Bilgisi Veriyor

20/10/2026
GitHub Copilot SDK: C# ile Kendi Modelinizi Bağlayın
Aşkın KILIÇ 0

GitHub Copilot SDK: C# ile Kendi Modelinizi Bağlayın

20/10/2026

2 comments

comments user
Selin N. 06/09/2026 15:48

Expand-and-contract yaklaşımı Azure SQL’de tam da “keşke uygulama hiç durmasa” derdine çözüm oluyor; 6 aşamalı plan mantıklı. Ben de daha önce çift yazma kısmında hata yapmamak için geçiş sürecini iyi planlamak gerektiğini yaşayarak öğrenmiştim. Siz bu yöntemde çift yazmayı kaç süre tutuyorsunuz?

Yanıtla
comments user
Murat Ö. 06/09/2026 16:40

Expand-and-contract yaklaşımı Azure SQL’de tam “kesintisiz” ihtiyacı karşılıyor gibi; çift yazma kısmı ilk başta kafa karıştırsa da pratikte çok mantıklı. Peki siz en çok hangi senaryoda (büyük tablolar mı, yoğun trafik mi) zorlandınız?

Yanıtla

Yorum gönder Yanıtı iptal et

Yazı Ara

Takip Edin

  • Takipçi
  • Takipçi
  • Takipçi
  • Abone
  • Takipçi
  • Visual Studio 2026: Commit'i Çalışma Ağacıyla Karşılaştırın
    21/10/2026 Visual Studio 2026: Commit’i Çalışma Ağacıyla Karşılaştırın
  • Azure DevOps Plugin ile Copilot'ta Backlog Yönetimi
    21/10/2026 Azure DevOps Plugin ile Copilot’ta Backlog Yönetimi
  • TypeScript 7.1 Beta: Import Attributes ve Yeni API
    21/10/2026 TypeScript 7.1 Beta: Import Attributes ve Yeni API
  • Dependabot Alerts REST API Artık Sürüm Bilgisi Veriyor
    20/10/2026 Dependabot Alerts REST API Artık Sürüm Bilgisi Veriyor
  • Browser Automation Tool Foundry Ajanlarına Tarayıcı Veriyor
    20/10/2026 Browser Automation Tool Foundry Ajanlarına Tarayıcı Veriyor
  • DevOps Güncellemeleri
    09/03/2026 Azure DevOps Server Şubat Güncellemesi: Güvenlik
  • 2026-03-10_15-35-23
    10/03/2026 Microsoft 365 E7: Yapay Zeka ve Güvenlik Bir Arada
  • Artımlı Anlık Görüntü: Anında Geri Yükleme
    09/03/2026 Artımlı Anlık Görüntü: Anında Geri Yükleme
  • Bulut Sunucu Altyapısı
    09/03/2026 Microsoft Sovereign Cloud: İzolasyonda Güvenli Bulut
  • Terminalde AI Ajanlarını Koddan Teste Taşımak: azd ile Gerçekten Yerel Deneyim
    18/03/2026 Terminalde AI Ajanlarını Koddan Teste Taşımak: azd ile Gerçekten Yerel Deneyim
  • GitHub Copilot Pro Denemeleri Neden Durdu?
    11/04/2026 GitHub Copilot Pro Denemeleri Neden Durduruldu?
  • vcpkg'de Paralel Kurulum ve Güvenlik Yaması: Neler Değişti?
    06/04/2026 vcpkg’de Paralel Kurulum ve Güvenlik Yaması: Neler Değişti?
  • MCP Apps’i Kolaylaştıran Fluent API: Sahada Ne Değişiyor?
    08/04/2026 MCP Apps’i Kolaylaştıran Fluent API: Sahada Ne Değişiyor?
  • Yapay Zekâ Çağında Sanayi Politikası: Asıl Mesela Ne?
    06/04/2026 Yapay Zekâ Çağında Sanayi Politikası: Asıl Mesela Ne?
  • Microsoft Foundry Mart 2026: Sahadan İlk İzlenimler
    10/04/2026 Microsoft Foundry Mart 2026: Sahadan İlk İzlenimler

Hakkımda

Aşkın KILIÇ

Microsoft Azure Çözüm Uzmanı. Bulut bilişim, yapay zekâ, DevOps ve kurumsal güvenlik üzerine yazılar yazıyorum.

Devamını Oku →

Kategoriler

  • Azure
  • Bulut Altyapı
  • DevOps
  • Geliştirici Araçları
  • Güvenlik & Kimlik
  • Konteyner & Kubernetes
  • Kurumsal Teknoloji
  • Microsoft 365
  • Microsoft Azure
  • Veri & Analitik
  • Yapay Zeka

Popüler Etiketler

AI ajanları ASP.NET Core Azure azure app service Azure Cosmos DB Azure Developer CLI Azure DevOps Azure OpenAI azure sdk Azure SQL CI/CD code review copilot Copilot CLI DevOps geliştirici verimliliği GitHub GitHub Actions GitHub Copilot güvenlik Kimlik Doğrulama Kubernetes Kurumsal geliştirme kurumsal güvenlik kurumsal yapay zeka maliyet optimizasyonu MCP Microsoft Agent Framework Microsoft Azure Microsoft Entra ID Microsoft Foundry otomasyon performans public preview Pull Request RAG REST API SEO uyumlu verimlilik veri yönetimi Visual Studio Visual Studio 2026 VS Code yapay zeka Yazılım geliştirme
  • Gizlilik Politikası
  • Çerez Politikası
  • Kullanım Koşulları
  • Hakkımda
  • İletişim

© 2026 Aşkın KILIÇ | Tüm hakları saklıdır. | Powered By SpiceThemes

Çerez tercihleri Zorunlu çerezler sitenin çalışması için kullanılır. Analitik çerezler yalnız açık izninizden sonra Google Analytics ve Microsoft Clarity için etkinleştirilir. KVKK ve Çerez Politikası
✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Ana Sayfa
Kategoriler
💻 Geliştirici Araçları 507 yazı 🏗️ Bulut Altyapı 407 yazı 🤖 Yapay Zeka 331 yazı ☁️ Microsoft Azure 279 yazı 🔧 DevOps 277 yazı 🔒 Güvenlik & Kimlik 223 yazı 🏢 Kurumsal Teknoloji 107 yazı 📊 Veri & Analitik 78 yazı 🐳 Konteyner & Kubernetes 62 yazı 📧 Microsoft 365 22 yazı 📁 Azure 1 yazı
Ara
Popüler
Yapay Zeka Azure Kubernetes DevOps Copilot Docker
Paylaş
WhatsApp
İçindekiler
    ← Fairwind Programı: Hükümetlere...
    Kurumsal Yapay Zekâda Azure’un... →
    📩

    Gitmeden önce!

    Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

    🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

    📬 Haftalık bülten: Teknoloji + AI haberleri
    Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.
    GitHub RSS