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 DELETEUPDATE ö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ı TABLE1bir 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 col1bir ç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 TABLE1tanı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.