Aracılığıyla paylaş


Nasıl bir veritabanına tanıtıcıları değişiklikleri izleme Değiştir

Değişiklik izleme kullanan bazı uygulamalar, başka bir veri deposu ile iki yönlü eşitlemeyi gerçekleştirmek.Diğer bir deyişle, yapılan değişiklikleri SQL Server veritabanı başka bir veri deposunda güncelleştirilir ve diğer depolama alanında yapılan değişiklikler de güncelleştirilir SQL Server Veritabanı.

Bir uygulama, başka bir veri deposundaki değişikliklerle yerel veritabanı güncelleştirdiğinde, bu uygulama aşağıdaki işlemleri gerçekleştirmelisiniz:

  • Çakışmaları denetleyin.

    Aynı anda aynı verileri değiştirildiğinde, BIR çakışma oluşur saat her iki veri depoları içinde.Uygulama bir çakışma denetleyin ve bu çakışmanın çözümlenmesi etkinleştirmek için yeterli bilgi edinmek çalıştırabilmesi gerekir.

  • Uygulama bağlamı bilgileri depolar.

    Uygulama, değişiklik izleme bilgilerini içeren veri depolar.Bu bilgiler, değişiklikler yerel veritabanından elde zaman izleme bilgilerini diğer değişiklik ile birlikte kullanılabilir olacaktır.Bu bağlamsal bilgiler yaygın bir örneği için veri deposunun bir tanımlayıcıdır kaynak değişikliği.

Önceki işlemleri gerçekleştirmek için , bir eşitleme uygulaması aşağıdaki işlevleri kullanabilirsiniz:

  • changetable(sürüm…)

    Uygulamayı değişiklik yaparken, bu çakışmalar için denetlemek için bu işlev kullanabilirsiniz.Işlev, en son değişiklik izleme için belirtilen satır izlenen değişiklik tablosundaki bilgileri alır.Izleme bilgilerini değiştir, en son değiştirilen satır sürüm içerir.Bu bilgiler, satır sonra uygulama eşitlendi: Tarih: son tarih değiştirilmiş olup olmadığını belirlemek bir uygulama sağlar.

  • change_tracking_context İLE

    Uygulama, bu yan tümce, içerik verileri depolamak için kullanabilirsiniz.

Çakışmalar için denetleniyor.

Iki yönlü eşitleme senaryosunda, istemci uygulaması, bu yana, uygulama, en son değişiklikleri alınan bir satır güncelleştirilmedi olup olmadığını belirlemeniz gerekir.

Aşağıdaki örnek, CHANGETABLE(sürüm …) işlev en verimli şekilde, ayrı bir sorgu olmadan çakışmalarını denetlemek için nasıl kullanılacağını gösterir.In the example, CHANGETABLE(VERSION …) determines the SYS_CHANGE_VERSION for the row specified by @product id.CHANGETABLE(CHANGES …) can obtain the same information, but that would be less efficient.Değeri SYS_CHANGE_VERSION satır için değerinden daha büyük @last\_sync\_version, çakışma yok. Çakışma varsa, satır güncelleştirilmeyecek.The ISNULL() check is required because there might be no change information available for the row.Hiçbir değişiklik bilgisini, değişiklik izleme etkinleştirildikten sonra satır güncelleştirilmiş değil veya değişiklik bilgilerini temizlendi bu yana mevcut.

-- Assumption: @last_sync_version has been validated.

UPDATE
    SalesLT.Product
SET
    ListPrice = @new_listprice
FROM
    SalesLT.Product AS P
WHERE
    ProductID = @product_id AND
    @last_sync_version >= ISNULL (
        SELECT CT.SYS_CHANGE_VERSION
        FROM CHANGETABLE(VERSION SalesLT.Product,
                        (ProductID), (P.ProductID)) AS CT),
        0)

Aşağıdaki kod, güncelleştirilen satır sayısı denetleyebilir ve çakışmayı hakkında daha fazla bilgi tanımlayabilirsiniz.

-- If the change cannot be made, find out more information.
IF (@@ROWCOUNT = 0)
BEGIN
    -- Obtain the complete change information for the row.
    SELECT
        CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_CREATION_VERSION,
        CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS
    FROM
        CHANGETABLE(CHANGES SalesLT.Product, @last_sync_version) AS CT
    WHERE
        CT.ProductID = @product_id;

    -- Check CT.SYS_CHANGE_VERSION to verify that it really was a conflict.
    -- Check CT.SYS_CHANGE_OPERATION to determine the type of conflict:
    -- update-update or update-delete.
    -- The row that is specified by @product_id might no longer exist 
    -- if it has been deleted.
END

Bağlam bilgilerini ayarlama

WITH CHANGE_TRACKING_CONTEXT yan tümcesini kullanarak, bir uygulama bilgileri birlikte, değişiklik bilgilerini depolayabilir.Bu bilgiler daha sonra CHANGETABLE(CHANGES …) tarafından döndürülen SYS_CHANGE_CONTEXT sütundan alınabilir.

Bilgileri genellikle değişiklikleri kaynağını tanımlamak için kullanılır.Kaynak değişikliği belirlenebilir, bu bilgileri bir veri deposu tarafından yeniden eşitlerken değişiklikleri alma önlemek için kullanılır.

  -- Try to update the row and check for a conflict.
  WITH CHANGE_TRACKING_CONTEXT (@source_id)
  UPDATE
     SalesLT.Product
  SET
      ListPrice = @new_listprice
  FROM
      SalesLT.Product AS P
  WHERE
     ProductID = @product_id AND
     @last_sync_version >= ISNULL (
         (SELECT CT.SYS_CHANGE_VERSION FROM CHANGETABLE(VERSION SalesLT.Product,
         (ProductID), (P.ProductID)) AS CT),
         0)

Tutarlı ve doğru sonuçlar doğrulanıyor

Bir uygulama, bu değeri, @ last_sync_version doğrular, temizleme işlemi düşünmeniz gerekir.Bu, çünkü bu CHANGE_TRACKING_MIN_VALID_VERSION() çağrıldı sonra veri kaldırılmış, ancak güncelleştirmenin yapıldı önce olur.

Important noteImportant Note:

Anlık görüntü yalıtım kullanın ve bir snapshot hareketi içinde değişiklik öneririz.

-- Prerequisite is to ensure ALLOW_SNAPSHOT_ISOLATION is ON for the database.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
    -- Verify that last_sync_version is valid.
    IF (@last_sync_version <
CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(‘SalesLT.Product’)))
    BEGIN
       RAISERROR (N’Last_sync_version too old’, 16, -1);
    END
    ELSE
    BEGIN
        -- Try to update the row.
        -- Check @@ROWCOUNT and check for a conflict.
    END
COMMIT TRAN

Not

anlık görüntü hareketi yeniden başlatılmasından sonra anlık görüntü hareketi içinde güncelleştirilen satır başka bir işlem içinde güncelleştirildiğini olasılığı vardır.Bu durum, anlık görüntü yalıtım güncelleştirme çakışması ortaya ve sonlandırıldı hareket için müşteri adayı.Bu durumda, bu güncelleştirmeyi yeniden deneyin.Bu, daha sonra değişiklik izleme çakışması algılandı ve değiştirilmesini hiçbir satır yol açacaktır.