Azure SQL Data Sync şema değişikliklerinin çoğaltılmasını otomatikleştirin

ŞUNUN İÇİN GEÇERLİDİR: Azure SQL Database

SQL Data Sync, kullanıcıların Azure SQL veritabanındaki veritabanları ve SQL Server örnekleri arasında verileri tek bir yönde veya her iki yönde eşitlemesine olanak tanır. SQL Data Sync geçerli sınırlamalarından biri, şema değişikliklerinin çoğaltılmasıyla ilgili desteğin olmamasıdır. Tablo şemasını her değiştirdiğiniz zaman, hub ve tüm Üyeler dahil olmak üzere tüm uç noktalarda değişiklikleri el ile uygulamanız gerekir ve ardından eşitleme şemasını güncelleştirebilirsiniz.

Bu makalede, şema değişikliklerinin tüm SQL Data Sync uç noktalara otomatik olarak çoğaltılması için bir çözüm sunulmaktadır.

  1. Bu çözüm, şema değişikliklerini izlemek için bir DDL tetikleyicisi kullanır.
  2. Tetikleyici, şema değiştirme komutlarını bir izleme tablosuna ekler.
  3. Bu izleme tablosu, veri eşitleme hizmeti kullanılarak tüm uç noktalarla eşitlenir.
  4. Diğer uç noktalara şema değişikliklerini uygulamak için ekleme yapıldıktan sonra DML Tetikleyicileri.

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

Önemli

Eşitleme ortamınızda otomatik şema değişiklik çoğaltmasını uygulamaya başlamadan önce bu makaleyi dikkatle, özellikle sorun giderme ve diğer hususlarhakkındaki bölümleri dikkatle okumanızı öneririz. Ayrıca, SQL Data Sync ile birden çok bulut ve şirket içi veritabanı arasında eşitleme verileriniokumanızı öneririz. Bazı veritabanı işlemleri bu makalede açıklanan çözümü bozabilir. Bu sorunları gidermek için SQL Server ve Transact-SQL ' e ait Ek etki alanı bilgileri gerekebilir.

Şema değişikliklerinin çoğaltılmasını otomatikleştirme

Otomatik şema değişiklik çoğaltmasını 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 bulunur. Gerekirse daha fazla bilgi günlüğe kaydetmek için daha fazla alan ekleyebilirsiniz.

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

Tüm uç noktalarında, en son uygulanan şema değiştirme 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, yalnızca bir eşitleme grubundaki 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şiklik izleme tablosuna bir kayıt ekler. Bu örnek, veri eşitleme hizmeti tarafından büyük olasılıkla yapıldığından, şema DataSync altında yapılan şema değişikliklerinin çoğaltılmasını önlemek için bir filtre ekler. Yalnızca belirli şema değişiklik türlerini çoğaltmak istiyorsanız daha fazla filtre ekleyin.

Diğer şema değişikliği 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ştirme komutunu yürütür. Bu tetikleyiciyi, şema değişikliklerinin yapıldığı (yani, DDL tetikleyicisinin önceki adımda oluşturulduğu veritabanında) hariç tüm uç noktalarında oluşturmanız gerekir AlterTableDDLTrigger .

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, ekleme işleminden sonra çalışır ve geçerli komutun bir sonraki çalıştırılıp çalıştırılmayacağını denetler. Kod mantığı, hiçbir şema değişikliği ifadesinin atlanmamasını sağlar ve ekleme sırası dışında olsa bile tüm değişiklikler uygulanır.

Şema değişiklik izleme tablosunu tüm uç noktalarla Eşitle

Şema değişiklik izleme tablosunu, var olan eşitleme grubunu veya yeni bir eşitleme grubunu kullanarak tüm uç noktalarla eşitleyebilirsiniz. İzleme tablosundaki değişikliklerin, özellikle de tek yönlü bir eşitleme kullanırken tüm uç noktalarla eşitlendiğinden emin olun.

Şema değişiklik geçmişi tablosunu eşitleme, bu tablo farklı uç noktalarda farklı bir durum sakladığı için.

Şema değişikliklerini bir eşitleme grubuna Uygula

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 üzere ek adımlar gerçekleştirmeniz gerekir.

Yeni sütun Ekle

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

  2. Tetikleyiciyi oluşturan adımı tamamlayana kadar yeni sütunların dahil edildiği herhangi bir veri değişikliğini önleyin.

  3. Şema değişiklikleri tüm uç noktalara uygulanana kadar 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ırma

  1. Eşitleme şemasından sütunları kaldırın. Veri eşitleme, bu sütunlardaki verileri eşitlemeyi durduruyor.

  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şiklikleri tüm uç noktalara uygulanana kadar bekleyin.

  3. Veritabanı şemasını yenileyin.

  4. Yeni ve eski veri türleri tamamen uyumlu değilse, örneğin, int -Sync olarak değiştirirseniz, bigint Tetikleyicileri oluşturma adımları tamamlanmadan önce başarısız olabilir. Eşitleme, yeniden denemeden sonra başarılı oldu.

Sütunları veya tabloları yeniden adlandırma

Sütunları veya tabloları yeniden adlandırmak, veri eşitlemenin çalışmayı durdurmasına neden olur. Yeni bir tablo veya sütun oluşturun, verileri geri girin ve ardından eski tabloyu veya sütunu yeniden adlandırmak yerine 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 bir dizini bırakma), eşitleme şemasının güncelleştirilmesi 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ı durduruyor. Örneğin, Azure SQL veritabanı 'nda desteklenmeyen bir şirket içi veritabanında bir şema değişikliği yaptıysanız. Bu durumda, şema değişiklik izleme tablosunu eşitleme başarısız olur. Bu sorunu el ile çözmeniz gerekir:

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

  2. Sorunun gerçekleştiği uç nokta veritabanında, şema değişikliğinin gerçekleşebileceği uç noktada ekleme tetikleyicisi ' ni devre dışı bırakın. Bu eylem, şema değiştirme komutunun eşitlenmesini sağlar.

  3. Şema değişiklik izleme tablosunu eşitlemek için eşitlemeyi tetikle.

  4. Sorunun gerçekleştiği uç nokta veritabanında, en son uygulanan şema değiştirme komutunun KIMLIĞINI almak için şema değişiklik geçmişi tablosunu sorgulayın.

  5. Önceki adımda aldığınız KIMLIK değerinden daha büyük bir KIMLIĞE sahip tüm komutları listelemek için şema değişiklik izleme tablosunu sorgulayın.

    a. Uç nokta veritabanında yürütülemeyen komutları yoksayın. Şema tutarsızlığı ile uğraşmanız gerekir. Tutarsızlık uygulamanızı etkirse, özgün şema değişikliklerini dönün.

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

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

  7. Şemanın güncel olup olmadığını iki kez kontrol edin.

  8. İkinci adımda INSERT tetikleyicisi devre dışı bırakıldıktan sonra yeniden etkinleştirin.

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

Şema değişiklik izleme tablosunda kayıtları temizlemek istiyorsanız, kes yerine DELETE kullanın. Şema değişiklik izleme tablosundaki kimlik sütunu DBCC CHECKIDENT kullanarak hiçbir şekilde yeniden sıfırlanıyor. Yeniden dağıtım gerekliyse, yeni şema değişiklik 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ştirme komutlarını yürütmek için yeterli izni olması gerekir.

  • Yalnızca seçili tablolardaki veya işlemlerdeki şema değişikliğini çoğaltmak için DDL tetikleyicisine daha fazla filtre ekleyebilirsiniz.

  • Şema değişikliklerini yalnızca DDL tetikleyicisinin oluşturulduğu veritabanında 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 sorundan kaçınmak için, diğer uç noktalarda değişiklikleri engellemek üzere DDL Tetikleyicileri oluşturabilirsiniz.

  • Şema değişiklik 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 INSERT tetikleyicisinden sonra şemanın güncelleştirilmesi çalışmaz.

  • DBCC CHECKIDENT kullanarak kimlik sütununu yeniden mühürmeyin.

  • Şema değişiklik izleme tablosunda verileri temizlemek için TRUNCATE kullanma.

Sonraki adımlar

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