Aracılığıyla paylaş


Değişiklik izleme değişiklikleri veritabanına nasıl işler

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

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

  • Çakışmaları denetleyin.

    Aynı veriyi aynı anda değiştiğinde bir çakışma oluşur saat her iki veri depolarında.Uygulama için bir çakışma alabilir ve çözümlenmesi çakışma etkinleştirmek için yeterli bilgi elde olmalıdır.

  • Uygulama bağlamı bilgileri depolar.

    Uygulama izleme bilgilerini değiştir veri depolar.Bu bilgi değişiklikleri yerel veritabanında edinilmiş, izleme bilgilerinin diğer değişiklik ile birlikte kullanılamaz.Bu bağlamsal bilgiler yaygın bir örnek, değişikliğin kaynak olan veri deposu için bir tanımlayıcıdır.

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

  • CHANGETABLE(VERSION…)

    Uygulama değişiklikleri yaparken, çakışmaları denetlemek için bu işlev kullanabilirsiniz.En son değişiklik bilgi için belirtilen satır da izlenen değişiklik izleme işlev alır tablo.İzleme bilgilerini değiştir, en son değiştirilen satır sürüm içerir.Sonra son satırın değiştirilip değiştirilmediğini belirlemek için bir uygulama bu bilgileri sağlayan saat uygulama eşitlenmiş.

  • İLE CHANGE_TRACKING_CONTEXT

    Bir uygulama bu yan tümce tümce bağlamı verileri depolamak için kullanabilirsiniz.

Çakışmaları denetleme

İki yönlü eşitleme senaryoda, istemci uygulaması uygulama son değişiklikleri elde beri bir satır güncelleştirilmedi olup olmadığını belirlemelidir.

Aşağıdaki örnek CHANGETABLE(VERSION …) işlev ayrı bir sorgu olmadan en verimli şekilde ç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.Varsa değeri SYS_CHANGE_VERSION satır için değeri büyük olan @last_sync_version, var. bir çakışmaÇakışma varsa, satır güncelleştirilmeyecek.The ISNULL() check is required because there might be no change information available for the row.Bilgilerini değiştirme değişiklik izleme etkinleştirildikten sonra satır güncelleştirilmişse değil veya değişiklik bilgilerini temizlenme beri 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ştirilmiş satır sayısı denetleyebilirsiniz 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

Bir uygulama ile CHANGE_TRACKING_CONTEXT yan tümce tümce tümce kullanarak içerik bilgileriyle birlikte değişiklik bilgilerini depolayabilir.Bu bilgiler daha sonra gelen elde edilebilir SYS_CHANGE_CONTEXT CHANGETABLE(CHANGES …) tarafından döndürülen sütun

Bağlam bilgileri genellikle kaynak değişiklikleri tanımlamak için kullanılır.Kaynak değişikliği tanımlanabilir, bu bilgileri yeniden eşitlerken, değişiklikleri alma önlemek için bir veri deposu kullanılabilir.

  -- 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ı sağlama

@ Last_sync_version değerinin Geçerliðini uygulama temizleme işlemi dikkate almanız gerekir.CHANGE_TRACKING_MIN_VALID_VERSION() çağrıldı sonra verileri kaldırılmış olduğundan, ancak güncelleştirme yapılmadan önceki budur.

Önemli notÖnemli

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ü hareket başlatıldıktan sonra snapshot hareketi içinde güncelleştirilen satır başka bir işlemde güncelleştirildiğini olanağı vardır.Bu durum, anlık görüntü yalıtım güncelleştirme çakışması oluşur ve neden Sonlandırılmakta olan hareket.Bu durumda, güncelleştirmeyi yeniden deneyin.Bu çakışma algılanması ve değiştirilmesini hiçbir satır izleme bir değişiklik neden.