Yayın Veritabanlarında Şema Değişiklikleri Yapma

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Çoğaltma, yayımlanan nesnelerde çok çeşitli şema değişikliklerini destekler. Microsoft SQL Server Publisher'da uygun yayımlanan nesnede aşağıdaki şema değişikliklerinden herhangi birini yaptığınızda, bu değişiklik varsayılan olarak tüm SQL Server Abonelerine yayılır:

  • ALTER TABLE

  • ALTER TABLE SETŞema değişikliği çoğaltması etkinleştirilmişse ve topoloji SQL Server 2005 (9.x) veya SQL Server Compact 3.5 abonelerini içeriyorsa, Kilit Yükseltme kullanılmamalıdır.

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

    ALTER TRIGGER [DDL] veri tanımlama dili tetikleyicileri çoğaltılamadığından yalnızca [DML] veri işleme dili tetikleyicileri için kullanılabilir.

Important

Tablolarda şema değişiklikleri Transact-SQL veya SQL Server Yönetim Nesneleri (SMO) kullanılarak yapılmalıdır. SQL Server Management Studio'de şema değişiklikleri yapıldığında, Management Studio tabloyu bırakma ve yeniden oluşturma girişiminde bulunur. Yayımlanan nesneleri bırakamazsınız, bu nedenle şema değişikliği başarısız olur.

İşlemsel çoğaltma ve birleştirme çoğaltması için, şema değişiklikleri Dağıtım Aracısı veya Birleştirme Aracısı çalıştığında artımlı olarak yayılır. Anlık görüntü çoğaltma için, aboneye yeni bir anlık görüntü uygulandığında şema değişiklikleri yayılır. Anlık görüntü çoğaltmada, eşitleme her gerçekleştiğinde aboneye şemanın yeni bir kopyası gönderilir. Bu nedenle, daha önce yayımlanmış nesnelerde yapılan tüm şema değişiklikleri (yalnızca yukarıda listelenenler değil) her eşitlemeyle otomatik olarak yayılır.

Yayınlara makale ekleme ve kaldırma hakkında bilgi için bkz . Varolan Yayınlara Makale Ekleme ve Varolan Yayınlardan Makaleleri Bırakma.

Şema değişikliklerini çoğaltmak için

Yukarıda listelenen şema değişiklikleri varsayılan olarak çoğaltılır. Şema değişikliklerini çoğaltmayı devre dışı bırakma hakkında bilgi için bkz. Şema Değişikliklerini Çoğaltma.

Şema Değişiklikleriyle İlgili Dikkat Edilmesi Gerekenler

Şema değişikliklerini çoğaltırken aşağıdaki noktaları göz önünde bulundurun.

Genel Dikkat Edilmesi Gerekenler

  • Şema değişiklikleri, Transact-SQL tarafından uygulanan kısıtlamalara tabidir. Örneğin, ALTER TABLE birincil anahtar sütunlarını DEĞIŞTIRMEnize izin vermez.

  • Veri türü eşlemesi yalnızca ilk anlık görüntü için gerçekleştirilir. Şema değişiklikleri, veri türlerinin önceki sürümleriyle eşlenmez. Örneğin, deyimi ALTER TABLE ADD datetime2 column SQL Server 2012'de (11.x) kullanılıyorsa, veri türü SQL Server 2005 (9.x) Aboneleri için nvarchar'a çevrilmemiştir. Bazı durumlarda, şema değişiklikleri Publisher'da engellenir.

  • Yayın, şema değişikliklerinin yayılmasına izin verecek şekilde ayarlandıysa, yayındaki bir makale için ilgili şema seçeneğinin nasıl ayarlandığına bakılmaksızın şema değişiklikleri yayılır. Örneğin, article tablosu için yabancı anahtar kısıtlamalarını çoğaltmamayı seçerseniz, ancak daha sonra Yayımcıdaki tabloya yabancı anahtar ekleyen bir ALTER TABLE komutunu çalıştırırsanız, yabancı anahtar Abonedeki tabloya eklenir. Bunu önlemek için, komutu vermeden önce ALTER TABLE şema değişikliklerinin yayılmasını devre dışı bırakın.

  • Şema değişiklikleri yalnızca Yayımcıda yapılmalıdır, Abonelerde (yeniden yayımlayan Aboneler dahil) yapılmamalıdır. Birleştirme çoğaltması Abonede şema değişikliklerini engeller. İşlem çoğaltması değişiklikleri engellemez, ancak değişiklikler çoğaltmanın başarısız olmasına neden olabilir.

  • Yeniden yayımlayan bir Aboneye iletilen değişiklikler, varsayılan olarak onun Abonelerine de iletilir.

  • Şema değişikliği, Publisher’da var olup Subscriber’da bulunmayan nesnelere veya kısıtlamalara atıfta bulunuyorsa, şema değişikliği Publisher’da başarılı olur; ancak Subscriber’da başarısız olur.

  • Yabancı anahtar eklenirken Abone üzerinde başvurulan tüm nesneler, Yayımcı üzerindeki karşılık gelen nesneyle aynı ad ve sahibine sahip olmalıdır.

  • Bir dizinin açıkça eklenmesi, kaldırılması veya değiştirilmesi çoğaltılmaz; açıkça belirtilmiş bir dizini içeren herhangi bir değişiklik her çoğaltma kümesinde ayrı ayrı yürütülmelidir. Kısıtlamalar için örtük olarak oluşturulan dizinler (birincil anahtar kısıtlaması gibi) desteklenir.

  • Çoğaltma tarafından yönetilen kimlik sütunlarının değiştirilmesi veya bırakılması desteklenmez. Kimlik sütunlarının otomatik yönetimi hakkında daha fazla bilgi için bkz . Kimlik Sütunlarını Çoğaltma.

  • Deterministik olmayan işlevler içeren şema değişiklikleri desteklenmez; çünkü Publisher’daki ve Subscriber’daki verilerin farklı olmasına neden olabilirler (buna yakınsamama denir). Örneğin, Yayıncıda aşağıdaki komutu çalıştırırsanız: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(), komut Aboneye çoğaltılıp çalıştırıldığında değerler farklı olur. Deterministik olmayan işlevler hakkında daha fazla bilgi için bkz. Deterministik ve Deterministik Olmayan İşlevler.

  • Kısıtlamaların açıkça adlandırılması önerilir. Bir kısıtlama açıkça adlandırılmazsa, SQL Server kısıtlama için bir ad oluşturur ve bu adlar Publisher ve her abonede farklı olur. Bu, şema değişikliklerini çoğaltma sırasında sorunlara neden olabilir. Örneğin, Yayımcıda bir sütunu kaldırırsanız ve bağımlı bir kısıtlama kaldırılırsa, çoğaltma bu kısıtlamayı Subscriber'da kaldırmaya çalışır. Kısıtlamanın adı farklı olduğundan Subscriber'daki DROP işlemi başarısız olacaktır. Eşitleme, bir kısıtlama adlandırma sorunu nedeniyle başarısız olursa, kısıtlamayı Abone'de el ile kaldırın ve ardından Merge Agent'ı yeniden çalıştırın.

  • Bir tablo çoğaltma için yayımlandıysa, yayın anlık görüntüsü zaten oluşturulmuşsa, bu tablodaki bir sütunu XML veri türüyle değiştirmek mümkün değildir Sütunu değiştirmek için önce çoğaltmayı kaldırmanız gerekir.

  • Yayınlanmış bir tablo üzerinde DDL işlemi yapılırken Read uncommitted desteklenen bir yalıtım düzeyi değildir.

  • SET CONTEXT_INFO şema değişikliklerinin yayımlanan nesnelere karşı gerçekleştirildiği işlemlerin bağlamını değiştirmek için kullanılmamalıdır.

Sütun Ekleme

  • Bir tabloya yeni bir sütun eklemek ve bu sütunu mevcut bir yayına dahil etmek için ALTER TABLE<Table> ADD <Column> komutunu çalıştırın. Varsayılan olarak, sütun tüm Abonelere çoğaltılır. Sütunun NULL değerlere izin vermesi veya varsayılan kısıtlaması içermesi gerekir. Sütun ekleme konusunda daha fazla bilgi için bu konudaki "Birleştirme Çoğaltması" bölümüne bakın.

  • Bir tabloya yeni bir sütun eklemek ve bu sütunu mevcut bir yayına dahil etmemek için şema değişikliklerinin çoğaltılmasını devre dışı bırakın ve ardından ALTER TABLE<Table> ADD <Column> komutunu çalıştırın.

  • Var olan bir sütunu var olan bir yayına eklemek için sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) veya Yayın Özellikleri - <Yayın> iletişim kutusunu kullanın.

    Daha fazla bilgi için bkz. Sütun Filtresi Tanımlama ve Değiştirme. Bunun için aboneliklerin yeniden başlatılması gerekir.

  • Yayımlanmış bir tabloya IDENTITY sütunu eklemek desteklenmez, çünkü sütunun Abone'ye çoğaltılması durumunda yakınsama olmamasına neden olabilir. Publisher'daki kimlik sütunundaki değerler, etkilenen tablonun satırlarının fiziksel olarak depolanma sırasına bağlıdır. Satırlar Abonede farklı şekilde depolanabilir; bu nedenle, kimlik sütununun değeri aynı satırlar için farklı olabilir.

Sütunları Silme

  • Var olan bir yayından bir sütunu kaldırmak ve bu sütunu Yayımcıdaki tablodan kaldırmak için ALTER TABLE<Table> DROP <Column> komutunu yürütün. Varsayılan olarak, ardından sütun tüm Abonelerdeki tablodan kaldırılır.

  • Var olan bir yayından sütun bırakmak ancak sütunu Publisher tabloda tutmak için sp_articlecolumn (Transact-SQL), sp_mergearticlecolumn (Transact-SQL) veya Yayın Özellikleri - <Yayın> iletişim kutusunu kullanın.

    Daha fazla bilgi için bkz. Sütun Filtresi Tanımlama ve Değiştirme. Bunun için yeni bir anlık görüntü oluşturulması gerekir.

  • Silinecek sütun, veritabanındaki herhangi bir yayının herhangi bir öğesinin filtre koşullarında kullanılamaz.

  • Yayımlanmış bir makaleden sütun bırakırken, sütunun veritabanını etkileyebilecek kısıtlamaları, dizinlerini veya özelliklerini dikkate alın. Örneğin:

    • Birincil anahtarda kullanılan sütunları, çoğaltma tarafından kullanıldıkları için işlemsel yayınlardaki makalelerden kaldıramazsınız.

    • Birleştirme yayımlarındaki makalelerden rowguid sütununu veya güncelleştirilebilir abonelikleri destekleyen işlemsel yayımlardaki makalelerden mstran_repl_version sütununu kaldıramazsınız; çünkü bu sütunlar çoğaltma tarafından kullanılır.

    • İndeks değişiklikleri Abonelere iletilmez: Yayıncıda bir sütunu kaldırırsanız ve buna bağlı bir indeks kaldırılırsa, indeksin kaldırılması çoğaltılmaz. Yayımlayıcıdaki sütunu kaldırmadan önce, bu sütun kaldırma işlemi Yayımlayıcıdan Aboneye çoğaltıldığında başarılı olması için Abonedeki dizini kaldırmalısınız. Eşitleme, Abone üzerindeki bir dizin nedeniyle başarısız olursa, dizini el ile silin ve ardından Merge Agent'ı yeniden çalıştırın.

    • Kısıtlamalar, gerektiğinde kaldırılabilmeleri için açıkça adlandırılmalıdır. Daha fazla bilgi için bu konunun önceki bölümlerinde yer alan "Genel Konular" bölümüne bakın.

İşlemsel Çoğaltma

  • Şema değişiklikleri, SQL Server önceki sürümlerini çalıştıran abonelere yayılır, ancak DDL deyimi yalnızca Abone sürümünde desteklenen söz dizimini içermelidir.

    Abone verileri yeniden yayımlarsa, desteklenen tek şema değişiklikleri bir sütun eklemek ve bırakmaktır. Bu değişiklikler Publisher DDL söz dizimi yerine sp_repladdcolumn (Transact-SQL) ve ALTER TABLE kullanılarak yapılmalıdır.

  • Şema değişiklikleri SQL Server olmayan Abonelere çoğaltılmaz.

  • Şema değişiklikleri SQL Server Olmayan Yayımcılardan yayılmaz.

  • Tablo olarak çoğaltılan dizinlenmiş görünümleri değiştiremezsiniz. Dizinli görünümler olarak çoğaltılan dizinlenmiş görünümler değiştirilebilir, ancak bunların değiştirilmesi dizinlenmiş görünümler yerine normal görünümlere dönüşlerine neden olur.

  • Yayım anında güncelleme veya kuyruğa alınmış güncelleştirme aboneliklerini destekliyorsa, şema değişiklikleri yapmadan önce sistemin durgun duruma getirilmesi gerekir: yayımlanan tablo üzerindeki tüm etkinlikler Yayımcıda ve Abonelerde durdurulmalı ve bekleyen veri değişiklikleri tüm düğümlere iletilmelidir. Şema değişiklikleri tüm düğümlere yayıldıktan sonra, yayımlanan tablolarda etkinlik devam edebilir.

  • Yayın eşler arası topolojideyse, şema değişiklikleri yapmadan önce sistemin sessize alınması gerekir. Daha fazla bilgi için Bir Çoğaltma Topolojisini Duraklatma (Çoğaltma Transact-SQL Programlaması) konusuna bakınız.

  • Tabloya zaman damgası sütunu eklemek ve zaman damgasını ikili(8) olarak eşlemek, makalenin tüm etkin abonelikler için yeniden başlatılmasına neden olur.

Birleştirme Replikasyonu

  • Birleştirme çoğaltmasının şema değişikliklerini nasıl işlediği, yayın uyumluluk düzeyi ile anlık görüntünün yerel moda (varsayılan) ya da karakter moduna ayarlanıp ayarlanmadığına göre belirlenir:

    • Şema değişikliklerini çoğaltmak için yayının uyumluluk düzeyi en az 90RTM olmalıdır. Aboneler SQL Server'in önceki sürümlerini çalıştırıyorsa veya uyumluluk düzeyi 90RTM'den azsa, sütun eklemek ve bırakmak için sp_repladdcolumn (Transact-SQL) ve sp_repldropcolumn (Transact-SQL) kullanabilirsiniz. Ancak, bu yordamlar kullanımdan kaldırılmıştır.

    • Var olan bir makaleye SQL Server 2008(10.0.x) ile tanıtılan veri türüne sahip bir sütun eklemeye çalışırsanız SQL Server aşağıdaki davranışa sahiptir:

      100RTM, yerel anlık görüntü 100RTM, karakter anlık görüntüsü Diğer tüm uyumluluk düzeyleri
      hierarchyid Değişikliğe izin ver Değişikliği engelle Değişikliği engelle
      coğrafya ve geometri Değişikliğe izin ver Değişikliğe izin ver* Değişikliği engelle
      Fılestream Değişikliğe izin ver Değişikliği engelle Değişikliği engelle
      date, time, datetime2 ve datetimeoffset Değişikliğe izin ver Değişikliğe izin ver* Değişikliği engelle

      *SQL Server Compact aboneleri bu veri türlerini Abone'de dönüştürür.

  • Şema değişikliği uygulanırken bir hata oluşursa (abonede bulunmayan bir tabloya başvuran yabancı anahtar ekleme hatası gibi), eşitleme başarısız olur ve aboneliğin yeniden başlatılması gerekir.

  • Birleştirme filtresine veya parametreli filtreye dahil olan bir sütunda şema değişikliği yapılırsa, tüm abonelikleri yeniden başlatmanız ve anlık görüntüyü yeniden oluşturmanız gerekir.

  • Birleştirme çoğaltması, sorun giderme sırasında şema değişikliklerini atlamaya yönelik saklı yordamlar sağlar. Daha fazla bilgi için bkz. sp_markpendingschemachange (Transact-SQL) ve sp_enumeratependingschemachanges (Transact-SQL).