Azure SQL Data Sync'te şema değişikliklerini çoğaltmayı otomatikleştirme

Şunlar için geçerlidir:Azure SQL Veritabanı

SQL Data Sync, kullanıcıların Azure SQL Veritabanı'ndaki veritabanları ile SQL Server örnekleri arasındaki verileri tek yönde veya her iki yönde eşitlemesini sağlar. SQL Data Sync'in geçerli sınırlamalarından biri, şema değişikliklerinin çoğaltılması için destek olmamasıdır. Tablo şemasını her değiştirdiğinizde, değişiklikleri hub ve tüm üyeler de dahil olmak üzere tüm uç noktalara el ile uygulamanız ve ardından eşitleme şemasını güncelleştirmeniz gerekir.

Bu makalede, şema değişikliklerini tüm SQL Data Sync uç noktalarına otomatik olarak çoğaltmaya yönelik bir çözüm tanıtılır.

  1. Bu çözüm, şema değişikliklerini izlemek için bir DDL tetikleyicisi kullanır.
  2. Tetikleyici, şema değişikliği komutlarını bir izleme tablosuna ekler.
  3. Bu izleme tablosu, Data Sync hizmeti kullanılarak tüm uç noktalarla eşitlenir.
  4. Eklemeden sonra DML tetikleyicileri, şema değişikliklerini diğer uç noktalara uygulamak için kullanılır.

Bu makalede şema değişikliğine örnek olarak ALTER TABLE kullanılır, ancak bu çözüm diğer şema değişiklikleri türleri için de kullanılabilir.

Önemli

Eşitleme ortamınızda otomatik şema değişikliği çoğaltmasını uygulamaya başlamadan önce bu makaleyi, özellikle Sorun Giderme ve Diğer önemli noktalar hakkındaki bölümleri dikkatle okumanızı öneririz. Ayrıca SQL Data Sync ile birden çok bulut ve şirket içi veritabanında veri eşitlemeyi okumanızı öneririz. Bazı veritabanı işlemleri bu makalede açıklanan çözümü bozabilir. Bu sorunları gidermek için SQL Server ve Transact-SQL hakkında ek etki alanı bilgisi gerekebilir.

Automating the replication of schema changes

Otomatik şema değişikliği çoğaltmayı ayarlama

Şema değişikliklerini izlemek için tablo oluşturma

Eşitleme grubundaki tüm veritabanlarında şema değişikliklerini izlemek için bir tablo oluşturun:

CREATE TABLE SchemaChanges (
ID bigint IDENTITY(1,1) PRIMARY KEY,
SqlStmt nvarchar(max),
[Description] nvarchar(max)
)

Bu tabloda şema değişikliklerinin sırasını izlemek için bir kimlik sütunu vardır. Gerekirse daha fazla bilgi kaydetmek için daha fazla alan ekleyebilirsiniz.

Şema değişikliklerinin geçmişini izlemek için tablo oluşturma

Tüm uç noktalarda, en son uygulanan şema değişikliği komutunun kimliğini izlemek için bir tablo oluşturun.

CREATE TABLE SchemaChangeHistory (
LastAppliedId bigint PRIMARY KEY
)
GO

INSERT INTO SchemaChangeHistory VALUES (0)

Şema değişikliklerinin yapıldığı veritabanında ALTER TABLE DDL tetikleyicisi oluşturma

ALTER TABLE işlemleri için bir DDL tetikleyicisi oluşturun. Bu tetikleyiciyi yalnızca şema değişikliklerinin yapıldığı veritabanında oluşturmanız gerekir. Çakışmaları önlemek için, eşitleme grubundaki tek bir veritabanında şema değişikliklerine izin verin.

CREATE TRIGGER AlterTableDDLTrigger
ON DATABASE
FOR ALTER_TABLE
AS

-- You can add your own logic to filter ALTER TABLE commands instead of replicating all of them.

IF NOT (EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(512)') like 'DataSync')

INSERT INTO SchemaChanges (SqlStmt, Description)
    VALUES (EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)'), 'From DDL trigger')

Tetikleyici, her ALTER TABLE komutu için şema değişikliği izleme tablosuna bir kayıt ekler. Bu örnek, büyük olasılıkla Data Sync hizmeti tarafından yapıldığından, datasync şeması altında yapılan şema değişikliklerinin çoğaltılmasını önlemek için bir filtre ekler. Yalnızca belirli şema değişiklikleri türlerini çoğaltmak istiyorsanız daha fazla filtre ekleyin.

Diğer şema değişiklikleri türlerini çoğaltmak için daha fazla tetikleyici de ekleyebilirsiniz. Örneğin, değişiklikleri saklı yordamlara çoğaltmak için CREATE_PROCEDURE, ALTER_PROCEDURE ve DROP_PROCEDURE tetikleyicileri oluşturun.

Ekleme sırasında şema değişikliklerini uygulamak için diğer uç noktalarda tetikleyici oluşturma

Bu tetikleyici, diğer uç noktalarla eşitlendiğinde şema değişikliği komutunu yürütür. Şema değişikliklerinin yapıldığı (yani önceki adımda DDL tetikleyicisinin oluşturulduğu veritabanında) dışında tüm uç noktalarda bu tetikleyiciyi AlterTableDDLTrigger oluşturmanız gerekir.

CREATE TRIGGER SchemaChangesTrigger
ON SchemaChanges
AFTER INSERT
AS
DECLARE @lastAppliedId bigint
DECLARE @id bigint
DECLARE @sqlStmt nvarchar(max)
SELECT TOP 1 @lastAppliedId=LastAppliedId FROM SchemaChangeHistory
SELECT TOP 1 @id = id, @SqlStmt = SqlStmt FROM SchemaChanges WHERE id > @lastAppliedId ORDER BY id
IF (@id = @lastAppliedId + 1)
BEGIN
    EXEC sp_executesql @SqlStmt
        UPDATE SchemaChangeHistory SET LastAppliedId = @id
    WHILE (1 = 1)
    BEGIN
        SET @id = @id + 1
        IF exists (SELECT id FROM SchemaChanges WHERE ID = @id)
            BEGIN
                SELECT @sqlStmt = SqlStmt FROM SchemaChanges WHERE ID = @id
                EXEC sp_executesql @SqlStmt
                UPDATE SchemaChangeHistory SET LastAppliedId = @id
            END
        ELSE
            BREAK;
    END
END

Bu tetikleyici eklemeden sonra çalışır ve geçerli komutun daha sonra çalıştırılıp çalıştırılmayacağını denetler. Kod mantığı hiçbir şema değişiklik deyiminin atlanmamasını ve ekleme sırasız olsa bile tüm değişikliklerin uygulanmasını sağlar.

Şema değişikliği izleme tablosunu tüm uç noktalarla eşitleme

Şema değişikliği izleme tablosunu mevcut eşitleme grubunu veya yeni bir eşitleme grubunu kullanarak tüm uç noktalarla eşitleyebilirsiniz. özellikle tek yönlü eşitleme kullanırken izleme tablosundaki değişikliklerin tüm uç noktalarla eşitlenebildiğinden emin olun.

Şema değişiklik geçmişi tablosunu eşitlemeyin çünkü bu tablo farklı uç noktalarda farklı durumdadır.

Şema değişikliklerini eşitleme grubuna uygulama

Yalnızca DDL tetikleyicisinin oluşturulduğu veritabanında yapılan şema değişiklikleri çoğaltılır. Diğer veritabanlarında yapılan şema değişiklikleri çoğaltılmaz.

Şema değişiklikleri tüm uç noktalara çoğaltıldıktan sonra, yeni sütunları eşitlemeyi başlatmak veya durdurmak için eşitleme şemasını güncelleştirmek için ek adımlar uygulamanız gerekir.

Yeni sütun ekleme

  1. Şema değişikliğini yapın.

  2. Tetikleyiciyi oluşturan adımı tamamlayana kadar yeni sütunların dahil olduğu veri değişikliklerinden kaçının.

  3. Şema değişikliklerinin tüm uç noktalara uygulanmasını bekleyin.

  4. Veritabanı şemasını yenileyin ve yeni sütunu eşitleme şemasına ekleyin.

  5. Yeni sütundaki veriler bir sonraki eşitleme işlemi sırasında eşitlenir.

Sütunları kaldır

  1. Sütunları eşitleme şemasından kaldırın. Veri Eşitleme, bu sütunlardaki verilerin eşitlenmesini durdurur.

  2. Şema değişikliğini yapın.

  3. Veritabanı şemasını yenileyin.

Veri türlerini güncelleştirme

  1. Şema değişikliğini yapın.

  2. Şema değişikliklerinin tüm uç noktalara uygulanmasını bekleyin.

  3. Veritabanı şemasını yenileyin.

  4. Yeni ve eski veri türleri tam olarak uyumlu değilse (örneğin, olarak değiştirirseniz intbigint ) tetikleyicileri oluşturan adımlar tamamlanmadan eşitleme başarısız olabilir. Yeniden denemeden sonra eşitleme başarılı olur.

Sütunları veya tabloları yeniden adlandırma

Sütunları veya tabloları yeniden adlandırmak, Data Sync'in çalışmayı durdurmasını sağlar. Yeni bir tablo veya sütun oluşturun, verileri yedekleyin ve yeniden adlandırmak yerine eski tabloyu veya sütunu silin.

Diğer şema değişikliği türleri

Diğer şema değişikliği türleri için (örneğin, saklı yordamlar oluşturma veya dizin bırakma) eşitleme şemasını güncelleştirme gerekli değildir.

Otomatik şema değişikliği çoğaltma sorunlarını giderme

Bu makalede açıklanan çoğaltma mantığı bazı durumlarda çalışmayı durdurur; örneğin, Azure SQL Veritabanı'nda desteklenmeyen bir şirket içi veritabanında şema değişikliği yaptıysanız. Bu durumda, şema değişikliği izleme tablosunu eşitleme başarısız olur. Bu sorunu el ile düzeltmeniz gerekir:

  1. DDL tetikleyicisini devre dışı bırakın ve sorun düzeltilene kadar başka şema değişikliklerinden kaçının.

  2. Sorunun oluştuğu uç nokta veritabanında, şema değişikliğinin yapılamadığı uç noktada INSERT SONRASI tetikleyicisini devre dışı bırakın. Bu eylem şema değiştirme komutunun eşitlenmesini sağlar.

  3. Şema değişikliği izleme tablosunu eşitlemek için eşitlemeyi tetikleyin.

  4. Sorunun oluştuğu uç nokta veritabanında şema değişiklik geçmişi tablosunu sorgular ve son uygulanan şema değişikliği komutunun kimliğini alırsınız.

  5. Önceki adımda aldığınız kimlik değerinden daha büyük bir kimliği olan tüm komutları listelemek için şema değişikliği izleme tablosunu sorgular.

    a. Uç nokta veritabanında yürütülemeyen komutları yoksayın. Şema tutarsızlığıyla ilgilenmeniz gerekir. Tutarsızlık uygulamanızı etkiliyorsa özgün şema değişikliklerini geri alın.

    b. Uygulanması gereken komutları el ile uygulayın.

  6. Şema değişiklik geçmişi tablosunu güncelleştirin ve son uygulanan kimliği doğru değere ayarlayın.

  7. Şemanın güncel olup olmadığını bir kez daha denetleyin.

  8. İkinci adımda AFTER INSERT tetikleyicisini yeniden etkinleştirin.

  9. İlk adımda DDL tetikleyicisini yeniden etkinleştirin.

Şema değişikliği izleme tablosundaki kayıtları temizlemek istiyorsanız, TRUNCATE yerine DELETE kullanın. DBCC CHECKIDENT kullanarak şema değişikliği izleme tablosundaki kimlik sütununu hiçbir zaman yeniden göndermedi. Yeniden izleme gerekiyorsa yeni şema değişikliği izleme tabloları oluşturabilir ve DDL tetikleyicisinde tablo adını güncelleştirebilirsiniz.

Diğer Konular

  • Hub'ı ve üye veritabanlarını yapılandıran veritabanı kullanıcılarının şema değişikliği komutlarını yürütmek için yeterli izne sahip olması gerekir.

  • DDL tetikleyicisine, şema değişikliğini yalnızca seçili tablolarda veya işlemlerde çoğaltmak için daha fazla filtre ekleyebilirsiniz.

  • Yalnızca DDL tetikleyicisinin oluşturulduğu veritabanında şema değişiklikleri yapabilirsiniz.

  • SQL Server veritabanında değişiklik yapıyorsanız Şema değişikliğinin Azure SQL Veritabanı'nda desteklendiğinden emin olun.

  • Şema değişiklikleri DDL tetikleyicisinin oluşturulduğu veritabanı dışındaki veritabanlarında yapılırsa, değişiklikler çoğaltılmaz. Bu sorunu önlemek için, diğer uç noktalarda yapılan değişiklikleri engellemek için DDL tetikleyicileri oluşturabilirsiniz.

  • Şema değişikliği izleme tablosunun şemasını değiştirmeniz gerekiyorsa, değişikliği yapmadan önce DDL tetikleyicisini devre dışı bırakın ve ardından değişikliği tüm uç noktalara el ile uygulayın. Aynı tablodaki BIR AFTER INSERT tetikleyicisindeki şema güncelleştirilmiyor.

  • DBCC CHECKIDENT kullanarak kimlik sütununu yeniden işaretlemeyin.

  • Şema değişikliği izleme tablosundaki verileri temizlemek için TRUNCATE kullanmayın.

Sonraki adımlar

SQL Data Sync hakkında daha fazla bilgi için bkz.: