Aracılığıyla paylaş


Değişiklik izleme ile çalışmak

Değişiklik izleme kullanan uygulamalar, izlenen değişiklikleri edinmek, bu değişiklikleri uygulamak için başka bir veri deposu ve kaynak veritabanını güncelleştirmek gerekir. Bu konu, bu görevleri hem çalış devretme oluşur ve veritabanını yedekten geri yüklenmesi gerekir izleme rol değişikliği gerçekleştirmek açıklar.

Bu Konuda

  • Değişiklik izleme işlevler kullanarak değişiklikleri elde

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

  • Değişiklik izleme ve veri geri yükleme

Değişiklik izleme işlevler kullanarak değişiklikleri elde

Değişiklik izleme işlevler değişiklikleri ve bir veritabanında yapılan değişiklikler hakkında bilgi edinmek için nasıl kullanılacağını açıklar.

Değişiklik izleme işlevler

Uygulamalar, bir veritabanı ve değişiklikler hakkında bilgi yapılan değişiklikleri edinmek için aşağıdaki işlevleri kullanabilirsiniz:

  • changetable (changes …) işlevi
    Bu satır kümesi işlevi kullanılır için değişiklik bilgilerini sorgulamak. Fonksiyonu dahili değişiklik izleme tablolarda depolanan veri sorgular. İşlev, birincil anahtarlar işlemi, updated sütun ve satır sürüm gibi diğer değişikliği bilgileri ile birlikte değişen bir satır içeren bir sonuç kümesi verir.

    CHANGETABLE(changes …), bağımsız değişken olarak bir son eşitleme sürüm alır. Son eşitleme sürüm kullanılarak elde edilen @last\_synchronization\_versiondeğişkeni. Son eşitleme sürüm semantiği aşağıdaki gibidir:

    • Arama istemci değişiklikleri elde etti ve tüm değişiklikleri son eşitleme sürüm (dahil) kadar bilir.

    • CHANGETABLE(changes …), bu nedenle son eşitleme sürüm sonra ortaya çıkan tüm değişiklikleri geri döner.

      Aşağıdaki resimde, CHANGETABLE(CHANGES …) değişiklikleri edinmek için nasıl kullanıldığını gösterir.

      Değişiklik izleme sorgu çıktısı örneği

  • CHANGE_TRACKING_CURRENT_VERSION() işlevi
    Sorgulama değiştiği sonraki kullanılacak geçerli sürümü elde etmek için kullanılır. Bu sürüm son kaydedilmiş hareket sürümünü gösterir.

  • CHANGE_TRACKING_MIN_VALID_VERSION () fonksiyonu
    Bir istemci varsa ve hala changetable() geçerli sonuçlar elde en az geçerli sürümünü elde etmek için kullanılır. İstemci bu işlevi tarafından döndürülen değer yaratır karşı son eşitleme sürüm kontrol etmelisiniz. Son eşitleme sürüm bu işlevi tarafından döndürülen sürüm'dan azsa, istemci changetable() geçerli sonuçlar elde etmek mümkün olacaktır ve yeniden başlatmak zorunda kalacak.

İlk veri alma

Uygulama değişiklikleri ilk kez elde edebilirsiniz önce uygulamanın ilk veri ve eşitleme sürüm için sorgu göndermeniz gerekir. Uygulama, doğrudan tablodan uygun veri almak ve ilk sürümünü edinmek için CHANGE_TRACKING_CURRENT_VERSION()'ı kullanın. Bu sürüm CHANGETABLE(CHANGES …) için değişiklikleri elde edilen ilk kez iletilecektir.

Aşağıdaki örnek, ilk eşitleme sürüm ve ilk veri kümesi alma gösterilmiştir.

    -- Obtain the current synchronization version. This will be used next time that changes are obtained.
    SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();

    -- Obtain initial data set.
    SELECT
        P.ProductID, P.Name, P.ListPrice
    FROM
        SalesLT.Product AS P

Değişiklikleri edinmek için değişiklik izleme işlevler kullanma

Değiştirilen satırlar için bir tablo ve değişiklikler hakkında bilgi edinmek için changetable(changes…) kullanın. Örneğin, aşağıdaki sorgu için değişiklikleri alır SalesLT.Producttablosu.

SELECT
    CT.ProductID, CT.SYS_CHANGE_OPERATION,
    CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT
FROM
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT

Genellikle, bir istemci bir satır satır yalnızca birincil anahtarlarını yerine en son verileri elde etmek istiyorum. Bu nedenle, uygulama kullanıcı tabloda CHANGETABLE(CHANGES …) sonuçları veri ile katılacak. Örneğin, aşağıdaki sorgu ile birleştiren SalesLT.Productdeğerlerini elde etmek için tablo Nameve ListPricesütun. Kullanın OUTER JOIN. Bu değişikliği bilgileri için kullanıcı tablosundan silinmiş satırlar döndürülür emin olmak için gereklidir.

SELECT
    CT.ProductID, P.Name, P.ListPrice,
    CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
    CT.SYS_CHANGE_CONTEXT
FROM
    SalesLT.Product AS P
RIGHT OUTER JOIN
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
    P.ProductID = CT.ProductID

Sonraki değişiklik numaralandırma kullanımda sürümünü edinmek için CHANGE_TRACKING_CURRENT_VERSION(), aşağıdaki örnekte gösterildiği gibi kullanın.

SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION()

Uygulama değişiklikleri aldığında, hem changetable(changes…) hem de CHANGE_TRACKING_CURRENT_VERSION(), aşağıdaki örnekte gösterildiği gibi kullanmak gerekir.

-- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called.
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();

-- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized.
SELECT
    CT.ProductID, P.Name, P.ListPrice,
    CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
    CT.SYS_CHANGE_CONTEXT
FROM
    SalesLT.Product AS P
RIGHT OUTER JOIN
    CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
    P.ProductID = CT.ProductID

Sürüm numaraları

Değişiklik izleme etkinleştirilmiş sahip bir veritabanı olarak izlenen tabloları değiştirme değişiklik artıran sürüm sayacı vardır. Her değişen satırla ilişkili bir sürüm numarası vardır. Sorgulamak için değişiklikleri uygulamaya bir istek gönderildiğinde, bir sürüm numarası sağlayan bir fonksiyonu çağrılır. İşlev bu sürümünden beri yapılan tüm değişiklikler hakkında bilgi verir. Bazı yönlerden sürüm izleme konsepti için benzer rowversionveri türü.

Sürüm eşitlenen son doğrulanıyor

Değişiklikler hakkında bilgi sınırlı bir süre için tutulur. Süre, alter database bir parçası olarak belirtilen CHANGE_RETENTION parametresi tarafından denetlenir.

CHANGE_RETENTION için belirtilen tüm uygulamalar veritabanından değişiklikleri ne sıklıkta istemelidir belirlediğini unutmayın. Bir uygulama için bir değer varsa last_synchronization_versionBu uygulama geçerli değişiklik numaralandırma yapamazsınız bir tablo için en az geçerli eşitleme sürümünden eski. Bunun nedeni, bazı değişiklik bilgilerini Temizlenen. changetable (changes …) kullanarak bir uygulama değişiklikleri alır önce uygulama değeri doğrulamak gerekir last_synchronization_versionchangetable (changes …) geçmek planlıyor. Eğer değeri last_synchronization_versionUygulama tüm verileri yeniden başlatmak gerekir geçerli değil.

Aşağıdaki örnek değerinin geçerliliğini gösterilmiştir last_synchronization_versionher tablo için.

    -- Check individual table.
    IF (@last_synchronization_version < CHANGE_TRACKING_MIN_VALID_VERSION(
                                       OBJECT_ID('SalesLT.Product')))
    BEGIN
      -- Handle invalid version and do not enumerate changes.
      -- Client must be reinitialized.
    END

Aşağıdaki örnekte gösterildiği değerinin geçerliliğini last_synchronization_versionveritabanındaki tüm tablolar karşı denetlenebilir.

    -- Check all tables with change tracking enabled
    IF EXISTS (
      SELECT COUNT(*) FROM sys.change_tracking_tables
      WHERE min_valid_version > @last_synchronization_version )
    BEGIN
      -- Handle invalid version & do not enumerate changes
      -- Client must be reinitialized
    END

Sütun izleme kullanma

Izleme sütun yerine bütün satır değiştirilen sütunlar için veri almak uygulamaları etkinleştirir. Örneğin, bir tablo büyük, ama nadiren değiştirmek bir veya daha fazla sütunu olan senaryoyu düşünün; ve sık sık değişen diğer sütunlar vardır. Sütun izleme olmadan uygulama yalnızca bir satır değişti ve büyük sütun veri içeren tüm verileri eşitlemek zorunda belirleyebilirsiniz. Ancak, izleme sütun kullanarak, bir uygulama bu değiştiyse değişen ve tek büyük sütun veri verileri eşitlemek olup olmadığını belirleyebilirsiniz.

Bilgi izleme sütun görünür SYS_CHANGE_COLUMNSişlevi changetable (changes …) tarafından döndürülen sütun.

Değişiklik olmadığı için bir sütun NULL değeri döndürülür böylece izleme sütun kullanılabilir. Sütun null olarak değiştirilebilir, ayrı bir sütun sütun değişip belirtmek için iade edilmesi gerekir.

Aşağıdaki örnekte, CT_ThumbnailPhotosütun olacak NULL, o sütun değişmedi. Bu sütun da olabilir NULLiçin değiştirdiğiniz NULL-uygulamanın kullanabileceği CT_ThumbNailPhoto_Changedsütun sütun değiştirilmiş olup olmadığını belirlemek için.

DECLARE @PhotoColumnId int = COLUMNPROPERTY(
    OBJECT_ID('SalesLT.Product'),'ThumbNailPhoto', 'ColumnId')

SELECT
    CT.ProductID, P.Name, P.ListPrice, -- Always obtain values.
    CASE
           WHEN CHANGE_TRACKING_IS_COLUMN_IN_MASK(
                     @PhotoColumnId, CT.SYS_CHANGE_COLUMNS) = 1
            THEN ThumbNailPhoto
            ELSE NULL
      END AS CT_ThumbNailPhoto,
      CHANGE_TRACKING_IS_COLUMN_IN_MASK(
                     @PhotoColumnId, CT.SYS_CHANGE_COLUMNS) AS
                                   CT_ThumbNailPhoto_Changed
     CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
     CT.SYS_CHANGE_CONTEXT
FROM
     SalesLT.Product AS P
INNER JOIN
     CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
     P.ProductID = CT.ProductID AND
     CT.SYS_CHANGE_OPERATION = 'U'

Tutarlı ve doğru sonuçlar elde etme

Bir tablo için değiştirilen veri alma birden çok adımı gerektirir. Tutarsız ya da yanlış sonuçları olabileceğini unutmayın bazı konuları kabul ele değil eğer ve döndü.

Örneğin, yapılan bu değişiklikleri edinmek için bir Salestablo ve SalesOrderstablosu, uygulama aşağıdaki adımları gerçekleştirmek istiyorsunuz:

  1. Son eşitlenmiş sürüm CHANGE_TRACKING_MIN_VALID_VERSION() kullanarak doğrula.

  2. Elde etmek için kullanılan sürümünü elde sonraki CHANGE_TRACKING_CURRENT_VERSION() kullanarak değiştirin.

  3. Değişiklikleri elde Saleschangetable (changes …) kullanarak tablo.

  4. Değişiklikleri elde SalesOrderschangetable (changes …) kullanarak tablo.

İki süreç ortaya çıkan veritabanında bulunan ve önceki adımları tarafından döndürülen sonuçlarını etkileyebilir:

  • Temizleme işlemi arka planda çalışır ve kaldırır belirtilen saklama dönemi eski izleme bilgileri değiştirin.

    Değişiklik izleme için veritabanı yapılandırdığınızda, belirtilen saklama dönemi kullanan ayrı arka plan işlem Temizleme işlemidir. Temizleme işlemi arasında ne zaman son eşitleme sürüm doğrulandı ve ne zaman changetable(changes…) çağrısı yapıldığı zaman içinde gerçekleşebileceğini konudur. Artık sadece geçerli bir son eşitleme sürüm değişiklikleri elde edilen zaman geçerli. Bu nedenle, yanlış sonuçlar döndü.

  • Devam eden dml işlemleri meydana gelen içinde Salesve SalesOrdersaşağıdaki işlemleri gibi tablolar:

    • Sürüm için sonraki CHANGE_TRACKING_CURRENT_VERSION() kullanarak alındıktan sonra değişiklikleri tablolara yapılabilir. Bu nedenle, beklenenden daha fazla değişiklik döndürülebilir.

    • Değişikliklerden edinmek için arama arasındaki süreyi de bir hareketi tamamlamak Salestablo ve değişikliklerden edinmek için arama SalesOrderstablosu. Bu nedenle, sonuçları SalesOrdertablo var yok yabancı anahtar değeri Salestablosu.

Yukarıda listelenen sorunları aşmak için anlık görüntü yalıtım kullanmanızı öneririz. Bu değişim bilgi tutarlılığı sağlamak ve arka plan temizleme görevi ile ilgili yarış durumları önlemek için yardımcı olur. Anlık görüntü hareketleri kullanmazsanız, değişiklik izleme kullanan bir uygulama geliştirmek çok daha fazla çaba gerektirebilir.

Anlık görüntü yalıtım kullanma

Değişiklik izlemeyi de snapshot yalıtım ile çalışma için dizayn edilmiştir. Anlık görüntü yalıtım için veritabanı etkin olması gerekir. Değişiklikleri edinmek için gereken tüm adımları bir snapshot hareketi içinde yer almalıdır. Bu veri değişiklikleri alırken yapılan tüm değişiklikleri sorgulara snapshot hareketi içinde görünür olmaz sağlayacaktır.

Snapshot hareketi içinde veri almak için aşağıdaki adımları gerçekleştirin:

  1. Anlık hareket yalıtım düzeyini ayarlayın ve bir işlem başlar.

  2. Son eşitleme sürüm CHANGE_TRACKING_MIN_VALID_VERSION() kullanarak doğrula.

  3. CHANGE_TRACKING_CURRENT_VERSION() kullanarak başlattığınızda kullanılacak sürümünü edinin.

  4. Değişiklikleri elde SalesCHANGETABLE(CHANGES …) kullanarak tablo

  5. Değişiklikleri elde SalesordersCHANGETABLE(CHANGES …) kullanarak tablo

  6. Hareketi tamamlamak.

Snapshot hareketi içinde değişiklikleri edinmek için tüm adımları bilinmesi gereken bazı noktalar şunlardır:

  • Son eşitleme sürüm doğrulandıktan sonra Temizleme oluşursa, Temizleme tarafından gerçekleştirilen silme işlemleri, bir hareketin içinde görünmez olarak CHANGETABLE(CHANGES …) sonuçlar yine de geçerli olur.

  • Yapılan değişiklikler Salestablo veya SalesOrdersSonraki eşitleme sürüm alındıktan sonra Tablo görünür olmayacak ve changetable (changes …) olacak aramaları asla değişiklikleri sonraki CHANGE_TRACKING_CURRENT_VERSION() tarafından döndürülen bir sürümüyle iade. Salestablosu ve SalesOrderstablosu arasındaki tutarsızlığın da sürdürülmesi gerekecektir, çünkü CHANGETABLE(CHANGES …) çağrıları arasında zaman zaman işlenen hareketler görünmez olacaktır.

Aşağıdaki örnek, veritabanı anlık görüntü yalıtım nasıl etkinleştirildiği gösterir.

-- The database must be configured to enable snapshot isolation.
ALTER DATABASE AdventureWorksLT
    SET ALLOW_SNAPSHOT_ISOLATION ON;

Snapshot hareketi aşağıdaki gibi kullanılır:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
  -- Verify that version of the previous synchronization is valid.
  -- Obtain the version to use next time.
  -- Obtain changes.
COMMIT TRAN

Anlık görüntü hareketleri hakkında daha fazla bilgi için bkz: set hareket yalıtım DÜZEYINE (Transact-sql).

Anlık görüntü yalıtım kullanma alternatifleri

Anlık görüntü yalıtım kullanma alternatifleri vardır, ancak tüm uygulama gereksinimlerinin karşılandığından emin olmak için daha fazla çalışma gerektirir. Emin olmak için last_synchronization_versiongeçerli olduğu ve önce değişiklikleri elde edilen veri temizleme işlemi tarafından kaldırılmaz, aşağıdakileri yapın:

  1. Kontrol last_synchronization_versionsonra changetable() çağrı.

  2. Kontrol last_synchronization_versionchangetable() kullanarak değişiklikleri elde etmek için her sorgu bir parçası olarak.

Eşitleme sürümünden sonraki numaralandırma için alındıktan sonra değişiklikleri oluşabilir. Bu durumu iki yolu vardır. Kullanılan seçeneği, uygulama ve nasıl-ebilmek deste o yan etkileri her yaklaşımın bağlıdır:

  • Yeni eşitleme sürümünden daha büyük bir sürümü olan değişiklikleri yoksayar.

    Bu yaklaşım yeni ya da güncelleştirilmiş satır olacaktır yan etkisi vardır, oluşturulan veya yeni eşitleme sürümünden önce updated, fakat sonra sonra güncelleştirilen atlanır. Yeni bir satır ise, varsa, oluşturulan başka bir tablodaki bir satır atlanan satır başvuru tutarlılığı sorun ortaya çıkabilir. Güncellenme Zamanı varolan satır ise, satır atlanır ve başlatana kadar eşitlenmiş değil.

  • Hatta, yeni eşitleme sürümünden daha büyük bir sürümü olan tüm değişiklikleri içerir.

    Yeni eşitleme sürümünden daha büyük bir versiyonu olan satırları tekrar sonraki eşitleme elde edilir. Bu beklenen olmalı ve uygulama tarafından işlenen.

Önceki iki seçenek ek işlem bağlı iki seçenek birleştiren bir yaklaşım Tasarlayabileceğiniz. Örneğin, bir uygulama için hangi satır oluşturulduğunda veya silindiğinde, ancak güncelleştirmeleri değil alınmaz sonraki eşitleme sürümünden daha yeni değişiklikleri yoksaymak iyi olduğu isteyebilirsiniz.

[!NOT]

Değişiklik izleme (veya herhangi bir özel izleme mekanizması) kullanırken, uygulama için çalışacak bir yaklaşım seçimi önemli bir analiz gerektirir. Bu nedenle, anlık görüntü yalıtım kullanın çok kolaydır.

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

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. Yani, içinde yapılan değişiklikler SQL Serververitabanı başka bir veri deposunda güncelleştirilir ve diğer deposunda yapılan değişiklikler güncelleştirilir SQL Serververitabanı.

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 hem veri depolarını değiştiğinde bir çakışma oluşur. Uygulama, bir çakışma denetlemek ve çatışma çözümlenmesi etkinleştirmek için yeterli bilgi elde etmek gerekir.

  • Uygulama bağlamı bilgileri depolar.

    Uygulama, izleme bilgisi değişikliği olan verileri depolar. Bu bilgiler başka değişiklik değişiklikler yerel veritabanından elde edildi zaman bilgileri izleme ile birlikte kullanılabilir olacaktır. Yaygın bir örnek, bu içerikle ilgili bilgilerin kaynağı Değiştir veri deposu için bir tanımlayıcıdır.

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

  • CHANGETABLE(VERSION…)

    Bir uygulama için değişiklik yaparken, çakışmaları denetlemek için bu işlevi kullanabilirsiniz. En son değişiklik değişiklik izlenen tabloda belirtilen bir satır bilgilerini izleme girdiyle. Izleme bilgilerini son değiştirilen satır içermektedir. Bu bilgiler, uygulama eşitlendi son kez sonra satır değiştirilen olup olmadığını belirlemek için bir uygulama sağlar.

  • CHANGE_TRACKING_CONTEXT İLE

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

Çakışmalar için denetlemek

İki yönlü eşitleme senaryoda, istemci uygulaması bu yana uygulamanın son değişiklikleri elde bir satır güncelleştirilmedi olup olmadığını belirlemeniz gerekir.

Aşağıdaki örnek CHANGETABLE(VERSION …) işlevi olmadan ayrı bir sorgu en verimli şekilde, çakışmaları denetlemek için nasıl kullanılacağını gösterir. Örnekte, CHANGETABLE(VERSION …)belirler SYS_CHANGE_VERSIONtarafından belirtilen satır @product id. CHANGETABLE(CHANGES …)aynı bilgileri elde edebilirsiniz, ama daha az etkili olacaktır. Eğer değeri SYS_CHANGE_VERSIONsatır değeri büyük olan @last\_sync\_version, bir çatışma. Çakışma varsa, satır güncelleştirilmez. ISNULL()Onay gerekli çünkü olabilir herhangi bir değişiklik bilgi satırında kullanılabilir. Hiçbir değişiklik bilgilerini değişiklik izleme etkinleştirildikten sonra satır güncelleştirilmiş değil veya değişiklik bilgilerini temizlenen 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ı kontrol edebilirsiniz ve çatışma 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

CHANGE_TRACKING_CONTEXT ile yan tümcesini kullanarak, bir uygulama içerik bilgileriyle birlikte değişiklik bilgilerini depolayabilir. Bu bilgiler daha sonra gelen elde edilebilir SYS_CHANGE_CONTEXTchangetable (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şitlendiğinde 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ğlamak

@ Last_sync_version değerini doğrulama zaman uygulama temizleme işlemi dikkate almanız gerekir. Çünkü CHANGE_TRACKING_MIN_VALID_VERSION() denilen sonra verileri kaldırılmış, ama önce güncelleme yapıldı 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 bir olasılık yoktur. Bu durumda, bir anlık görüntü yalıtım güncelleştirme çakışması ortaya ve Sonlandırılmakta harekete yol. Bu durumda, güncelleştirmeyi yeniden deneyin. Bu daha sonra değişiklik algıladığı çatışma ve değiştirilen satır izleme sağlayacaktır.

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

Değişiklik izleme ve veri geri yükleme

Eşitleme gerektiren uygulamalar, verileri önceki bir sürümüne sahip bir veritabanı değişiklik izleme etkinleştirilmiş durumda döner dikkate almanız gerekir. Ne zaman orada bir zaman uyumsuz veritabanı yansıtma için yük devretme ya da günlük sevkiyat kullanırken bir hata olduğu zaman bir veritabanı bir yedekten geri yüklendikten sonra oluşabilir. Aşağıdaki senaryoda sorun gösterilmektedir:

  1. Tablo T1değişikliği izlenir ve tablo için en az geçerli sürüm 50.

  2. Bir istemci uygulaması sürüm 100 verileri eşitler ve sürümleri 50 ile 100 arasında tüm değişiklikler hakkındaki bilgileri alır.

  3. Ek değişiklikler yapılan tablo T1sonra sürüm 100.

  4. Sürüm 120, bir hata ve veritabanı yöneticisi veritabanı veri kaybı ile geri yükler. Geri yükleme işlemi sonra tablo veri sürümü üzerinden 70 kadar içerir ve az eşitlenmiş sürüm hala 50'dir.

    Bu eşzamanlı veri deposu artık birincil veri deposunda veri olduğu anlamına gelir.

  5. T1birçok kez güncellenir. Bu geçerli sürümü için 130 getiriyor.

  6. İstemci uygulaması yeniden eşitler ve 100 son eşitlenmiş bir sürümünü sağlar. 100 50'den büyük olduğu için istemci bu numarayı başarıyla doğrular.

    İstemci, 100-130 sürüm arasındaki değişiklikleri alır. Bu aşamada istemci 70 ile 100 arasındaki değişiklikleri aynı eskisi gibi değildir farkında değil. İstemci ve sunucu veriler eşitlenmiyor.

Not veritabanı sürüm 100 sonra bir noktaya kurtarıldı, orada olacağını eşitleme ile hayır problem. Verileri istemci ve sunucu, sonraki eşitleme aralığında doğru eşitlemek.

Değişiklik izleme, veri kaybı kurtarmak için destek sağlamaz. Ancak, bu tür Eşitleme sorunları algılamak için iki seçenek vardır:

  • Veritabanı sürüm kimliği sunucuda depolamak ve her bir veritabanı kurtarılan veya başka veri kaybeder bu değeri güncelleştirin. Her istemci uygulamasının kimliğini saklamak ve her istemcinin verilerini eşitlerken bu kimliğini doğrulamak olurdu. Veri kaybı oluşursa, kimlikleri eşleşmeyecek ve istemcilerini yeniden başlatmak. Tek dezavantajı, veri kaybı son eşitlenmiş sınırı geçmişti değil, müşteri-ebilmek yapmak gereksiz reinitialization olmasıdır.

  • Bir istemci için değişiklikleri sorgularken, her istemci sunucu için son eşitleme sürüm numarasını kaydedin. Verileri ile ilgili bir sorun varsa, son eşitlenmiş sürüm numaraları eşleşmeyecektir. Bu bir reinitialization gerekli olduğunu gösterir.

Başa Dön bağlantısıyla kullanılan ok simgesi[Top]

Ayrıca bkz.

Başvuru

CHANGETABLE (Transact-SQL)

CHANGE_TRACKING_MIN_VALID_VERSION (Transact-sql)

CHANGE_TRACKING_CURRENT_VERSION (Transact-sql)

CHANGE_TRACKING_CONTEXT (Transact-sql) ile

Kavramlar

Veri değişiklikleri izle

Değişiklik izleme hakkında

Değişiklik izleme yönetme

Değişiklik izlemeyi devre