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.
- Bu çözüm, şema değişikliklerini izlemek için bir DDL tetikleyicisi kullanır.
- Tetikleyici, şema değişikliği komutlarını bir izleme tablosuna ekler.
- Bu izleme tablosu, Data Sync hizmeti kullanılarak tüm uç noktalarla eşitlenir.
- 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.
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
Şema değişikliğini yapın.
Tetikleyiciyi oluşturan adımı tamamlayana kadar yeni sütunların dahil olduğu veri değişikliklerinden kaçının.
Şema değişikliklerinin tüm uç noktalara uygulanmasını bekleyin.
Veritabanı şemasını yenileyin ve yeni sütunu eşitleme şemasına ekleyin.
Yeni sütundaki veriler bir sonraki eşitleme işlemi sırasında eşitlenir.
Sütunları kaldır
Sütunları eşitleme şemasından kaldırın. Veri Eşitleme, bu sütunlardaki verilerin eşitlenmesini durdurur.
Şema değişikliğini yapın.
Veritabanı şemasını yenileyin.
Veri türlerini güncelleştirme
Şema değişikliğini yapın.
Şema değişikliklerinin tüm uç noktalara uygulanmasını bekleyin.
Veritabanı şemasını yenileyin.
Yeni ve eski veri türleri tam olarak uyumlu değilse (örneğin, olarak değiştirirseniz
int
bigint
) 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:
DDL tetikleyicisini devre dışı bırakın ve sorun düzeltilene kadar başka şema değişikliklerinden kaçının.
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.
Şema değişikliği izleme tablosunu eşitlemek için eşitlemeyi tetikleyin.
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.
Ö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.
Şema değişiklik geçmişi tablosunu güncelleştirin ve son uygulanan kimliği doğru değere ayarlayın.
Şemanın güncel olup olmadığını bir kez daha denetleyin.
İkinci adımda AFTER INSERT tetikleyicisini yeniden etkinleştirin.
İ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.:
- Genel Bakış - Azure SQL Data Sync ile verileri birden çok bulut ve şirket içi veritabanı arasında eşitleme
- Data Sync'i ayarlama
- Portalda - Öğretici: Azure SQL Veritabanı ile SQL Server arasında verileri eşitlemek için SQL Data Sync'i ayarlama
- PowerShell ile
- Data Sync Aracısı - Azure SQL Data Sync için Veri Eşitleme Aracısı
- En iyi yöntemler - Azure SQL Data Sync için en iyi yöntemler
- İzleyici - Azure İzleyici günlükleriyle SQL Data Sync'i izleme
- Sorun giderme - Azure SQL Data Sync ile ilgili sorunları giderme
- Eşitleme şemasını güncelleştirme
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin