Aracılığıyla paylaş


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

Bu konuda değişiklik izleme işlevlerini açıklar SQL Server 2008 ve veritabanı ve hakkında bilgi yapılan değişiklikleri edinmek için kullanmadeğişiklikleri.

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

Uygulamaları, veritabanı ve değişiklikler hakkındaki bilgiler yaptığınız değişiklikleri edinmek için aşağıdaki işlevleri kullanabilirsiniz:

  • (Değişiklikler …) changetable işlev
    Bu satır kümesi işlev kullanılır sorgulamak için bilgilerini değiştirme.işlev iç değişiklik izleme tablolarda depolanan veri sorgular.işlev, işlem, güncelleştirilmiş sütunları ve satır sürüm gibi diğer değişiklik bilgilerini birlikte değişen satır birincil anahtarlar içeren sonuçlar küme 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_version değişken olarak gösterilen örneklerdeki bu konuda.semantik 'In son eşitleme sürüm aşağıdaki gibidir:

    • Çağrıyı yapan istemci değişiklikleri elde ve en çok ve en son eşitleme sürüm dahil olmak üzere tüm değişiklikler hakkındaki 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 …) bu 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şlev
    Geçerli elde etmek için kullanılan sürüm , kullanılacak sonraki sefer sorgulama değiştiğinde.Bu sürüm son gerçekleşen işlem sürümünü gösterir.

  • CHANGE_TRACKING_MIN_VALID_VERSION () işlev
    Bir istemci varsa ve hala changetable() geçerli sonuçlar elde en az geçerli sürüm elde etmek için kullanılır.istemci, bu işlev tarafından döndürülen değeri thatis karşı son eşitleme sürüm kontrol etmelisiniz.Son eşitleme sürüm bu işlev tarafından döndürülen sürüm küçükse, istemci changetable() geçerli sonuçlar elde edemez ve yeniden başlatmak zorunda kalırsınız.

İlk veri elde etme

Bir uygulama ilk kez değişiklikleri elde edebilirsiniz önce saat, uygulamanın ilk veri ve eşitleme sürüm elde etmek için bir sorgu göndermeniz gerekir.Uygulama doğrudan uygun veri almanız gerekir tablove CHANGE_TRACKING_CURRENT_VERSION() ilk sürüm elde etmek için kullanın.Bu sürüm changetable (değişiklik …) ilk geçirilecek olan saat değişiklikleri elde edilir.

Aşağıdaki örnekte ilk eşitleme sürüm ve ilk veri küme elde etmek nasıl gösterir.

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

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

Değiştirilen satırlar için 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.Product tablo.

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 için bir satır satır için yalnızca birincil anahtarlar yerine en son verileri elde etmek isteyebilirsiniz.Bu nedenle, uygulama değişikliği sonuçlar katılmaktablo(değişiklik …) kullanıcı veri ile tablo.Örneğin, aşağıdaki sorgu, ile birleştiren SalesLT.Product değerlerini elde etmek için tablo Name ve ListPrice sütunlar.Kullanımına dikkat edin OUTER JOIN.Bu, kullanıcı silinmiş satırları için değişiklik bilgisini verdiğini emin olmak için gereklidir tablo.

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 bir sürüm elde etmek 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 hem changetable(changes…) hem de CHANGE_TRACKING_CURRENT_VERSION(), aşağıdaki örnekte gösterildiği gibi kullanmanız 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 özelliği etkin olan bir veritabanı izlenen tabloları değiştirmek için değişiklik yapıldıkça artırır 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 uygulama için bir istek gönderildiğinde, bir sürüm numarası sağlayan bir işlev çağrılır.işlev, bu yana yapılan tüm değişiklikler hakkında bilgi verir sürüm.Bazı yönlerden değişiklik sürüm izleme kavramı için de benzer rowversion veri türü.

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

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

Dikkat edin, saat CHANGE_RETENTION belirler için belirtilen, ne sıklıkta tüm uygulamaları değişiklik veritabanından istemeniz gerekir.Bir uygulama için bir değer içeriyorsa, last_synchronization_version 'den en az geçerli eşitleme eski sürüm bir tablo için bu uygulama geçerli değişiklik numaralandırma. yapamazsınızBazı değişiklik bilgisini temizlendiği olmasıdır.changetable (değişiklik …) kullanarak bir uygulama değişiklikleri alır önce uygulama değeri doğrulamak last_synchronization_version planladığı geçirmek için CHANGETABLE(CHANGES …).Varsa değeri last_synchronization_version geçerli değil, uygulama olduğunu gerekir yeniden başlatmak tüm veri.

Aşağıdaki örnek, nasıl değerinin geçerliliğini gösterir last_synchronization_version için her 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 gibi, değerinin geçerliliğini last_synchronization_version kontrol karşı tüm tablolarda 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 yerine tüm satır değiştirilen sütunlar için veri elde etmek uygulamaları etkinleştirir.Örneğin, bir tablo, büyük, ancak ender bir veya daha fazla sütun olan senaryoyu düşünün; ve sık sık değişen diğer sütunlar da vardır.Sütun izleme olmadan bir 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 değiştiğini, büyük sütun veri değiştirildi ve yalnızca verileri eşitlemenizi olup olmadığını belirleyebilirsiniz.

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

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

Aşağıdaki örnekte, CT_ThumbnailPhoto sütun olacak NULL , o sütun vermedi Değiştir.Bu sütun da olabilir NULL çünkü için değiştirildiği NULL -uygulamanın kullanabileceği CT_ThumbNailPhoto_Changed sü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.Belirli sorunları kabul ve işlenmiş, tutarsız veya yanlış sonuçlar döndürdü unutmayın.

Örneğin, yapılan değişiklikleri edinmek için bir Sales Tablo ve SalesOrders tablosu, bir uygulama aşağıdaki adımları:

  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 elde farklı saat kullanarak CHANGE_TRACKING_CURRENT_VERSION().

  3. İçin de bu değişiklikleri edinmek Sales Tablo kullanarak CHANGETABLE(CHANGES …).

  4. İçin de bu değişiklikleri edinmek SalesOrders Tablo kullanarak CHANGETABLE(CHANGES …).

İ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 belirtilen saklama dönemi'den daha eski izleme bilgileri değiştirin.

    Değişiklik izleme için veritabanı yapılandırdığınızda, belirtilen saklama dönemi kullanan ayrı bir arka plan işlemi temizleme işlemidir.Temizleme işlemi arasındaki son eşitleme sürüm doğrulandı ne saat ve ne saat changetable(changes…) çağrısı yapıldığı saat oluşabilir sorun oluşmaktadır.Yalnızca geçerli bir son eşitleme sürüm artık değişiklikleri elde edilen saat geçerli.Bu nedenle, yanlış sonuçlar verdi.

  • dml işlemleri içinde oluştuğunu Sales ve SalesOrders , aşağıdaki işlemleri gibi tablolar:

    • Değişiklik yapılamıyor tablolara ileri sürüm sonra saat CHANGE_TRACKING_CURRENT_VERSION() kullanılarak elde edilmiş.Bu nedenle, beklenenden daha fazla değişiklik döndürülebilir.

    • Bir hareket içinde commit saat değişikliklerden edinmek için çağrı arasında Sales Tablo ve değişikliklerden edinmek için çağrı SalesOrders tablosu.Bu nedenle, sonuçlar için SalesOrder tablo içinde yok yabancı anahtar değeri olabilir Sales tablo.

Yukarıda listelenen yenmek için anlık görüntü yalıtım kullanmanızı öneririz.Bu ortamda bilgilerini değiştirme ve arka plan temizleme görevle 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 izleme, anlık görüntü yalıtım ile iyi çalışması için tasarlanmıştır.Anlık görüntü yalıtım için veritabanı etkin olması gerekir.Bu değişiklikleri edinmek için gereken tüm adımları anlık görüntü görüntü hareketi içinde dahil edilmesi gerekir.Bu değişiklikler alırken verilerde yapılan tüm değişiklikleri sorgular anlık görüntü görüntü hareketi içinde görünür olmaz garanti eder.

anlık görüntü görüntü hareketi içinde verileri elde etmek için aşağıdaki adımları gerçekleştirin:

  1. Set işlem yalıtım düzey anlık görüntü ve işlem başlangıç için.

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

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

  4. İçin de bu değişiklikleri edinmek Sales CHANGETABLE(CHANGES …) kullanarak tablo

  5. İçin de bu değişiklikleri edinmek Salesorders CHANGETABLE(CHANGES …) kullanarak tablo

  6. Hareketi kaydedin.

anlık görüntü görüntü hareketi içinde değişiklikleri elde etmek için tüm adımları dikkat edilmesi 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 işlem içinde görünür olacak şekilde CHANGETABLE(CHANGES …) sonuçlar geçerli olmaya devam edecektir.

  • Yapılan herhangi bir değişiklik Sales Tablo veya SalesOrders Tablo sonra sonraki eşitleme sürüm elde edilir görünür olmayacak ve CHANGETABLE(CHANGES …) yapılan hiçbir zaman değişiklikleri CHANGE_TRACKING_CURRENT_VERSION() tarafından döndürülen'dan sonraki bir sürüme sahip dönmekArasında tutarlılık Sales Tablo ve SalesOrders Tablo da tutulan, CHANGETABLE(CHANGES …) yapılan çağrılar arasında saat kaydedilmiş hareketlerin görünür olacağı için.

Aşağıdaki örnek için bir 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 AdventureWorksLT2008
    SET ALLOW_SNAPSHOT_ISOLATION ON;

Anlık görüntü hareket aşağıdaki şekilde 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: Satır sürüm oluşturma tabanlı yalıtım düzeyleri kullanma.

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

Anlık görüntü yalıtım kullanmaya 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_version geçerli olduğu ve veri değişiklikleri elde önce temizleme işlemi tarafından kaldırılmaz, aşağıdakileri yapın:

  1. Kontrol last_synchronization_version sonra yapılan changetable().

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

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

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

    Bu yaklaşımın, yeni veya güncelleştirilmiş bir satır olacak yan etkisi vardır, oluşturulan veya yeni eşitleme sürüm güncelleştirildi, ancak sonradan güncelleştirildi, atlandı.Yeni bir satır ise, varsa bir satır başka bir bilgi tutarlılığı sorun ortaya çıkabilir tablo atlanan satır başvurulan oluşturulmuş.Güncelleştirilmiş bir varolan satır ise, satır atladı ve sonraki kadar eşitlenmedi saat.

  • Olanlar 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 sürüm varsa satır üzerinde bir sonraki eşitleme yeniden elde edilir.Bu beklenen ve gerekir uygulama tarafından işlenen.

Önceki iki seçeneklere ek olarak, işlem türüne göre her iki seçenek birleştiren yaklaşım insanlara.Örneğin, onu olduğu sonraki eşitlemede yeni değişiklikleri yoksaymak en iyi uygulama isteyebilirsiniz sürüm , satır oluşturulduğunda veya silindiğinde, ancak güncelleştirmeleri yoksayılır.

Not

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