Aracılığıyla paylaş


Değişiklikleri işlevler izleme değişikliği kullanarak alma

Bu konu, değişiklik izleme işlevlerini açıklarSQL Server 2008ve bir veritabanı ve bilgi yapılan değişiklikleri almak için kullanma değişiklikleri.

Değişiklik izleme işlevleri hakkında

Uygulama, veritabanı ve değişiklikler hakkında bilgi yaptığınız değişiklikleri almak için aşağıdaki işlevleri kullanabilirsiniz:

  • CHANGETABLE (… değişiklikleri) işlev
    Bu satır kümesi kümesi işlev değişikliği bilgileri için sorgulanamıyor.işlev İç değişiklik izleme tabloları depolanan verileri sorgular.Bir işlevi döndüren küme diğer değişiklik bilgilerini işlem, güncelleştirilmiş sütun ve satır sürüm ile birlikte değişen satır birincil anahtarlar içerir.

    CHANGETABLE(CHANGES …) son eşitleme sürüm bir baðýmsýz deðiþken olarak alýr.Son eşitleme sürüm mantığı aşağıdaki gibidir:

    • Çağrıyı yapan istemci değişiklikleri elde ve tüm değişiklikleri kadar ve son eşitleme sürüm bilmektedir.

    • Bu nedenle, CHANGETABLE(CHANGES …) son eşitleme sürüm sonra ortaya çıkan tüm değişiklikleri geri gönderir.

      Aşağıdaki resimde gösterilmiştir nasıl CHANGETABLE(CHANGES …) için kullanılan elde değişiklikler.

      Example of change tracking query output

  • CHANGE_TRACKING_CURRENT_VERSION() işlev
    Geçerli elde etmek için kullanılır, sürümünde kullanılan sonraki saat değişiklikleri sorgularken.Bu son kaydedilmiş hareketi sürüm gösterir.

  • CHANGE_TRACKING_MIN_VALID_VERSION () işlev
    Bir istemci varsa ve hala geçerli sonuçlar CHANGETABLE() almak en geçerli sürüm elde etmek için kullanılır.İstemci, son eşitleme sürüm bu işlev tarafından döndürülen değeri belirtilmemiş karşı denetlemelisiniz.Son eşitleme sürüm bu işlev tarafından döndürülen daha azsa, istemci CHANGETABLE() geçerli sonuçlar elde etmek mümkün olmayacaktır ve yeniden başlatmanız gerekir.

İlk veri alma

Önce uygulamanın değişiklikleri ilk kez elde edebilirsiniz saat, uygulamanın ilk veri ve eşitleme sürüm elde etmek için bir sorgu göndermeniz gerekir.Uygulamanın uygun verileri doğrudan edinmelisiniz tablo ve CHANGE_TRACKING_CURRENT_VERSION() ilk sürüm elde etmek için kullanın.Bu değişiklikler elde edilen ilk kez CHANGETABLE(CHANGES …) için gönderilir.

Aşağıdaki örnek, ilk eşitleme sürüm ve ilk veri kümesi 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şiklik izleme işlevleri kullanarak değişiklikleri elde

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 sorguyu değişiklikleri alırSalesLT.ProductTablo.

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, istemci için bir satır satır için yalnızca birincil anahtarlar yerine en güncel verileri elde etmek isteyeceksiniz.Bu nedenle, uygulama veri CHANGE tablo(CHANGES …) sonuçlar kullanıcı katılmak tablo.İle örneğin, aşağıdaki sorgu birleştirenSalesLT.Producttablo değerleri elde etmek içinNameveListPricesütun.Not kullanımıOUTER JOIN.Bu değişiklik bilgilerini kullanıcı tablosundan silinmiş satırları için verilen 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 kullanmak için sürüm 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, onu CHANGETABLE(CHANGES…) hem CHANGE_TRACKING_CURRENT_VERSION(), aşağıdaki örnekte gösterildiği gibi kullanmalısınız.

-- 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ş olan bir veritabanında izlenen tabloları değiştirmek için değişiklik yapıldıkça artırır sürüm sayacı vardır.Değişen her satırı ile ilişkili sürüm numarası vardır.Sorguya yapılan bir uygulama için bir istek gönderilir, sürüm numarası sağlayan bir işlev çağrılır.İşlev bu sürüm bu yana yapılan tüm değişiklikler hakkında bilgi verir.Bazı yollar, değişiklik izleme sürüm kavramı için de benzerrowversionveri türü.

Sürüm eşitlenen son doğrulama

Değişiklikler hakkındaki bilgileri sınırlı bir saat için korunur.saat, ALTER DATABASE bir parçası olarak belirtilen CHANGE_RETENTION parametresi ile kontrol edilir.

Unutmayın, saat CHANGE_RETENTION belirleyen için belirtilen tüm uygulamalar veritabanındaki değişiklikleri ne sıklıkta istemelidir.Bir uygulama için bir değer varsalast_synchronization_versionolan sürümünden daha eski en az geçerli eşitleme bir tablo için uygulama gerçekleştiremiyor geçerli değişiklik numaralandırma.Bazı değişiklik bilgilerini temizlemiş olmasıdır.Önce bir uygulama kullanarak CHANGETABLE(CHANGES …), değişiklikleri alır uygulama gerekir doğrulama değerilast_synchronization_versionplanlar CHANGETABLE(CHANGES …). geçirmek, Değerilast_synchronization_versiongeçerli değil, gereken uygulamayı yeniden tüm verileri.

Aşağıdaki örnekte gösterildiği değerinin geçerliliğini doğrulamak içinlast_synchronization_versionher tablo.

    -- 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ğinilast_synchronization_versionkullanıma karşı tüm tablolar veritabanı.

    -- 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

İzleme sütun yalnızca değiştirilen tüm satır yerine sütunlar için verileri elde etmek uygulamaları etkinleştirir.Senaryo, örneğin, düşünün bir tablo büyük, ancak nadiren değiştirme; ve de sık sık değişen diğer sütunları bir veya birden çok sütunu vardır.Sütun izleme olmadan, bir uygulama yalnızca bir satır değişti ve büyük sütun verileri içeren tüm verileri eşitlemek zorunda belirleyebilirsiniz.Ancak, izleme sütunu kullanarak, bir uygulama değişmişse, değişiklik ve yalnızca büyük sütun verileri verileri eşitleyin olup olmadığını belirleyebilirsiniz.

İzleme bilgilerini sütun CHANGETABLE(CHANGES …) işlev tarafından döndürülen SYS_CHANGE_COLUMNS sütunu görünür.

İzleme sütun NULL değiştirilmediği için bir sütun döner böylece kullanılabilir.Sütun NULL olarak değiştirilebilir, ayrı bir sütun sütunun değiştirilip belirtmek için iade edilmesi gerekir.

Aşağıdaki örnekte,CT_ThumbnailPhotosütun olacakNULLsütun mı değildir Değiştir.Bu sütun da olabilirNULLçünkü için değiştirilmişNULL-Uygulama kullanarakCT_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.Bazı sorunları ele ele ve değil tutarsız veya yanlış sonuçlar döndürülmesi, dikkat edin.

Örneğin, bir satış için yapılan değişiklikleri almak için tablo ve SalesOrders tablo, uygulama aşağıdaki adımları:

  1. CHANGE_TRACKING_MIN_VALID_VERSION() kullanarak eşzamanlı en son sürüm doğrulayın.

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

  3. Değişiklikleri elde etmek için satış tablo CHANGE tablo(CHANGES …) kullanarak.

  4. Değişiklikler SalesOrders tablo CHANGETABLE(CHANGES …) kullanarak alın.

İki işlem veritabanında bulunan önceki adımları tarafından döndürülen sonuçlar etkiler ortaya çıkan:

  • Temizleme işlemi arka planda çalışır ve kaldırır belirli bir tutma süresinden daha eski izleme bilgileri değiştirin.

    Değişiklik izleme veritabanı için yapılandırırken belirttiğiniz saklama dönemi kullanan bir farklı arka plan işlemi temizleme işlemidir.Temizleme işlemi arasındaki son eşitleme sürüm ne saat doğrulandı ve ne saat CHANGETABLE(CHANGES…) çağrısı yapılır, ortaya çıkabilecek sorun oluşmaktadır.Yalnızca geçerli olduğu son eşitleme sürüm, artık değişiklikleri elde edilen saat geçerli olabilir.Bu nedenle, yanlış sonuçlar iade edilmesi.

  • Devam eden DML işlemleri satış ve SalesOrders tabloları, aşağıdaki işlemleri gibi ortaya çıkan:

    • Değişiklikler yapılması tabloları sonra bir sonraki sürümü saat CHANGE_TRACKING_CURRENT_VERSION() kullanarak elde.Bu nedenle, beklenenden daha fazla değişiklik döndürülebilir.

    • Satış değişiklikleri almak için arama arasındaki süreyi, bir hareketi tamamlamak tablo ve SalesOrders değişiklikleri almak için çağrı tablo.Bu nedenle, satış siparişi tablosu için sonuçlar satış tablosunda bulunmayan yabancı anahtar değeri olabilir.

Yukarıda listelenen sorunları çözmek için anlık görüntü yalıtım kullanmanızı öneririz.Bu değişiklik bilgilerinin tutarlılığını sağlamak ve arka plan temizleme görevle ilgili yarış durumları önlemek için yardımcı olur.Anlık görüntü hareketleri kullanmak, değişiklik izleme kullanan bir uygulama geliştirme önemli ölçüde daha fazla çaba gerektirebilir.

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

Değişiklik izleme, iyi anlık görüntü görüntü yalıtım ile çalışmak için tasarlanmıştır.Anlık görüntü yalıtım veritabanı için etkinleştirilmiş olması gerekir.Değişiklikleri almak için gereken tüm adımları bir anlık görüntü hareketi içinde dahil edilmesi gerekir.Bu, veri değişiklikleri alırken yapılan tüm değişiklikler görünür anlık görüntü hareketi içinde sorguları olmaz garanti eder.

Bir anlık görüntü hareketi içinde veri almak için aşağıdaki adımları uygulayın:

  1. Anlık görüntü için işlem yalıtım düzey ayarlayın ve bir işlem başlatın.

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

  3. Elde sonraki sürümü için kullanılan saat CHANGE_TRACKING_CURRENT_VERSION() kullanarak.

  4. Değişiklikleri elde etmek için satış tablo CHANGE tablo(CHANGES …) kullanarak

  5. Değişiklikler Salesorders tablo CHANGETABLE(CHANGES …) kullanarak elde edilir.

  6. İşlem tamamlanamadı.

Bir anlık görüntü hareketi içinde bazı noktaları unutmayın değişiklikleri almak için tüm adımları şunlardır:

  • Son eşitleme sürüm doğrulandıktan sonra temizleme ortaya çıkarsa, temizleme tarafından gerçekleştirilen silme işlemleri işlem içinde görünür olacak şekilde CHANGETABLE(CHANGES …) sonuçlar hala geçerli olur.

  • Satış yapılan değişiklikleri tablo veya SalesOrders tablo sonraki eşitleme sürüm alındıktan sonra görünmez ve CHANGE tablo(CHANGES …) yapılan değişikliklerle CHANGE_TRACKING_CURRENT_VERSION() tarafından döndürülen'dan sonraki bir sürüm hiç döner.Satış arasında tutarlılığı tablo ve SalesOrders tablo CHANGE tablo(CHANGES …) yapılan arasındaki saat içinde kaydedilen hareketleri görünür olmaz çünkü da, korunur.

Aşağıdaki örnek, bir veritabanını 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;

Bir anlık görüntü işlem 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ü işlemleri hakkında daha fazla bilgi için bkz:Satır Güncelleştirme tabanlı yalıtım düzeyleri kullanma.

anlık görüntü yalıtım kullanmaya seçenekleri

Kullanarak anlık görüntü görüntü yalıtım seçenekleri vardır, ancak bunlar tüm uygulama gereksinimleri karşılandığında emin olmak için daha çok iş gerektirir.Emin olmak içinlast_synchronization_versiongeçerli olduğundan ve veri değişiklikleri elde edilen önce temizleme işlemi tarafından kaldırılmaz, aşağıdakilerden birini yapın:

  1. Denetlemelast_synchronization_versionsonra çağrıları CHANGETABLE().

  2. Denetlemelast_synchronization_versionher sorgu kullanarak değişiklikleri almak için bir parçası olarak CHANGETABLE().

Sonraki numaralandırma eşitleme sürüm alındıktan sonra değişiklikleri oluşabilir.Bu durumu için iki yol vardır.Uygulama ve her yaklaşımın yan etkileri nasıl işlemek kullanılan seçenek bağlıdır:

  • Yeni eşitleme sürümünden daha büyük sürüm değişiklikleri yoksayın.

    Bu yaklaşımın, yeni veya güncelleştirilmiş bir satır olacak yan etkisi vardır, oluşturulan veya önce yeni eşitleme sürüm güncelleştirildi, ancak daha sonra güncelleştirildi, atlandı.Yeni bir satır varsa, varsa bir başka bilgi tutarlılığı ile ilgili bir sorun ortaya çıkabilir tablo atlanan satır başvurulan oluşturulmuş.Güncelleştirilmiş bir varolan satır varsa, satır geçildi ve açana kadar eşitlenir.

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

    Yeni eşitleme sürümünden daha büyük sürüm varsa, satırları yeniden sonraki eşitlemede elde edilir.Bu olmalı beklenen ve uygulama tarafından işlenen.

Önceki iki seçeneklere ek olarak işleme bağlı olarak, her iki seçeneği birleştirerek yaklaşım insanlara.Örneğin, kendisi için satırı oluşturulur veya silinir, ancak güncelleştirmeleri yok sayılır bir sonraki eşitleme sürümünden daha yeni değişiklikleri yoksaymak için en uygun olan bir uygulama isteyebilirsiniz.

Not

Değişiklik izleme (veya herhangi özel bir izleme mekanizması) kullanıyorsanız, uygulamanın çalışması yaklaşımı seçme önemli analiz gerektirir.Bu nedenle, anlık görüntü yalıtım kullanmak çok kolaydır.