UPDATE deyimleri DELETE/INSERT çiftleri olarak çoğaltılabilir
Bu makalede, Update deyimlerinin DELETE/INSERT çiftleri olarak çoğaltılabileceği açıklanmaktadır.
Özgün ürün sürümü: SQL Server
Özgün KB numarası: 238254
Özet
Benzersiz bir kısıtlamanın parçası olan herhangi bir sütun güncelleştirilirse, SQL Server güncelleştirmeyi "ertelenen güncelleştirme" olarak uygular ve bu da bir işlem çifti DELETE
/INSERT
anlamına gelir. Bu "ertelenen güncelleştirme", çoğaltmanın DELETE
/INSERT
abonelere bir çift deyim göndermesine neden olur. Ertelenmiş bir güncelleştirmeye neden olabilecek başka durumlar da vardır. Bu nedenle, abonede tetikleyicilerinize veya özel saklı yordamlarınıza uyguladığınız UPDATE
tüm iş mantığı tetikleyicilere veya özel saklı yordamlara da dahil DELETE
/INSERT
edilmelidir.
Daha fazla bilgi
İşlem çoğaltmasında varsayılan davranış, abonelere değişiklik uygulamak için ve DELETE
UPDATE
özel saklı yordamları kullanmaktırINSERT
.
INSERT
Yayımcı'da yapılan deyimler, bir INSERT
saklı yordam çağrısı aracılığıyla abonelere uygulanır. Benzer şekilde, bir DELETE
deyimi saklı DELETE
yordam çağrısı aracılığıyla uygulanır.
Ancak, bir UPDATE
deyimi "ertelenmiş güncelleştirme" olarak yürütülürse, logreader aracısı bir güncelleştirme saklı yordam çağrısı yerine abonelere uygulanacak dağıtım veritabanına bir çift DELETE
/INSERT
saklı yordam çağrısı yerleştirir. Örneğin, şu üç sütunu içeren adlı TABLE1
bir yayımlama tablonuz olduğunu varsayalım:
- col1 int
- col2 int
- col3 varchar(30)
üzerindeki tek benzersiz kısıtlama TABLE1
birincil anahtar kısıtlaması aracılığıyla tanımlanır col1
. Bir kaydınız olduğunu varsayalım (1,1,'Dallas').
Bu kodu yürütürken:
UPDATE TABLE1 set col1 = 3 where col3 = 'Dallas'
deyimi, UPDATE
SQL Server tarafından, benzersiz bir dizin tanımlı olan öğesini güncelleştirdiğinizden col1
bir çift DELETE
/INSERT
deyim olarak uygulanır. Bu nedenle, logreader dağıtım veritabanına bir çift DELETE
/INSERT
çağrı yerleştirir. Bu, abonedeki tetikleyicilerde veya özel saklı yordamlarda bulunan tüm iş mantığını etkileyebilir. Bu durumu işlemek için ek iş mantığını DELETE
ve INSERT
tetikleyicilerine veya saklı yordamlara dahil etmelisiniz.
Tek bir mantık kullanmayı tercih ediyorsanız ve tüm komutlarınızın UPDATE
çift olarak DELETE
/INSERT
çoğaltılmasını istiyorsanız, izleme bayrağını etkinleştirebilirsiniz.
Ayrıca, yayınınızda yatay bir filtre kullanıyorsanız ve güncelleştirilmiş satır bir filtre koşulunu karşılamıyorsa abonelere yalnızca bir DELETE
yordam çağrısı gönderilir. Güncelleştirilen satır daha önce filtre koşulunu karşılamadıysa ancak güncelleştirmeden sonraki koşulu karşılıyorsa, çoğaltma işlemi aracılığıyla yalnızca INSERT
yordam çağrısı gönderilir.
Yukarıdaki örnekte, üzerinde TABLE1
tanımlanmış yatay bir filtreniz olduğunu varsayalım: where col3 = 'Dallas'
. Bu kodu yürütürseniz:
UPDATE table1 set col3 = 'New York' where col1 = 3
güncelleştirilmiş satır yatay filtre ölçütlerini karşılamadığından logreader aracısı yalnızca abonelere uygulanacak saklı yordam çağrısını yerleştirir DELETE
.
Şimdi, bu kodu yürütürseniz:
UPDATE table1 set col3 = 'Dallas' where col1 = 3
satır daha önce filtre koşulunu INSERT
karşılamadığından logreader yalnızca saklı yordam çağrısını oluşturur.
Publisher'da bir UPDATE
işlem gerçekleştirilse de aboneye yalnızca uygun komutlar uygulanır.
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