Aracılığıyla paylaş


Değiştir hazır veridir olup olmadığını belirleme

Denetim akışında bir bir artımlı yük değişiklik veri, ikinci görev yapan Integration Servicespaketidir seçili aralığı değişikliği veri hazır olduğundan emin olun. Çünkü zaman uyumsuz yakalama işlemi henüz tüm değişiklikleri kadar seçili bitiş noktasına uygulanmamasına bu adım gereklidir.

[!NOT]

İlk görev akış denetimi için değişiklik aralığı bitiş noktaları hesaplamak etmektir. Bu görev hakkında daha fazla bilgi için bkz: Bir değişikliği veri aralığı belirtme. Denetimi akışı tasarlama işlemi açıklaması için bkz: (SSIS) verisini Değiştir yakalama.

Paketleri içinde değişiklik veri yakalama kullanımını gösteren eksiksiz, uçtan uca örnekler için bkz: Readme_Change Data Capture for Specified Interval Package Sampleve Readme_Change Data Capture since Last Request Package Sample.

Çözüm bileşenleri anlama

Bu konuda açıklanan çözüm 4 kullanır Integration Servicesbileşenleri:

  • Sürekli bir yürütme sql görev çıkışı değerlendiren bir döngü için kapsayıcı.

  • Değişiklik veri işlemi yakalama özel tablolar sorgular sql Yürüt görev saklar ve sonra veri hazır olup olmadığını belirlemek için bu bilgileri kullanır.

  • Veri hazır olduğunda işleme gecikme uygulayan bir bileşeni. Bu Script görev veya sql Yürüt görev olabilir.

  • sql Yürüt görevi bir hata veya zaman aşımı koşulu gösteren bir değeri döndürür olduğunda bir hata veya zaman aşımı raporları isteğe bağlı olarak bir bileşendir.

Bu bileşenleri ayarlayın veya yürütme döngü içinde ve daha sonra paketi akışını denetlemek için birkaç paketi değişkenlerinin değerlerini okuyun.

Paketi değişkenleri ayarlamak için

  • De SQL Server Veri Akışı Araçları (SSDT), değişkenleri penceresinde aşağıdaki değişkenleri oluşturun:

    1. sql Yürüt görev tarafından döndürülen durum değeri tutmak için bir tamsayı veri türündeki bir değişkeni oluşturun.

      Bu örnek, bir başlangıç değeri 0 ile DataReady, değişken adını kullanır.

    2. Veri hazır değilse geciktirmek için süre tutmak için bir değişken oluşturun. Gecikme uygulamak için Script görev kullanın planlıyorsanız, değişken bir tamsayı veri türü tamsayı olmalıdır. WAITFOR deyimi ile sql Yürüt görev kullanın planlıyorsanız, değişken değerleri olarak kabul etmek için bir dize veri türü olmalıdır "00: 00:10".

      Bu örnek, bir başlangıç değeri 10 ile DelaySeconds, değişken adını kullanır.

    3. Bir değişken, döngüyü geçerli yineleme tutmak için bir tamsayı veri türü ile oluşturun.

      Bu örnek, bir başlangıç değeri 0 ile TimeoutCount, değişken adını kullanır.

    4. Zaman aşımı koşulu raporlama önce döngüye sınamalısınız kez veri belirtmek için bir tamsayı veri türündeki bir değişkeni oluşturun.

      Bu örnek, bir başlangıç değeri 20 ile TimeoutCeiling, değişken adını kullanır.

    5. (İsteğe bağlı) Değişiklik veri ilk yük belirtmek için kullanabileceğiniz bir tamsayı veri türündeki bir değişkeni oluşturun.

      Bu örnek ilk yük belirtmek için yalnızca 0 değeri için çekler, IntervalID ve değişken adını kullanır.

Yapılandırma bir döngü kapsayıcı için

Değişkenleri ile döngü için kapsayıcı eklenecek ilk bileşen kümesidir.

Veri değişikliği kadar beklemek için döngü kapsayıcı yapılandırmak için hazır

  1. Tarih Denetimi akışı sekmesini SSISTasarımcısı eklemek için döngü kapsayıcı denetimi akışı için.

  2. Döngü için kapsayıcı için aralığın bitiş noktaları hesaplar yürütme sql görev bağlanın.

  3. İçinde İçin döngü Düzenleyicisi'ni, aşağıdaki seçenekleri işaretleyin:

    1. İçin InitExpression, girmek @DataReady = 0.

      Bu ifade, döngü değişkeninin başlangıç değeri ayarlar.

    2. İçin EvalExpressionm, girmek @DataReady == 0.

      Bu ifadeyi değerlendirirken yanlış, yürütme döngü dışında geçirir ve artımlı yük başlatır.

Yapılandırma değişikliği veri sorgular sql görev Yürüt

Döngü için kapsayıcı içinde sql Yürüt görev ekleyin. Bu görev sorgular tablo verisini Değiştir işlemi yakalama veritabanında tutar. Bu sorgu sonuç değişiklik veri hazır olup olmadığını gösteren bir durum değeridir.

Aşağıdaki tabloda, sql Yürüt görev örnek Transact-sql sorgu tarafından döndürülen değerler için ilk sütunu gösterir. İkinci sütun, diğer bileşenler bu değerlere nasıl tepki gösterir.

Dönüş Değeri

Anlamı

Yanıt

0

Değişiklik veri hazır olduğunu gösterir.

Seçili aralığı bitiş noktası daha sonra değişiklik veri yakalama kayıt yok orada.

Yürütme gecikme uygulayan bileşeni ile devam eder. Daha sonra Denetim sql Yürüt görev olarak döndürülen değer 0 olup devam için döngü kapsayıcı için döndürür.

1

Değişiklik veri tam aralığını yakalandı yok veya silinmiş olan gösterebilir. Bu bir hata koşulu kabul edilir.

Orada hiçbir değişiklik veri yakalama kayıt öncesi seçilen aralığın başlangıç noktası

Yürütme hata günlükleri isteğe bağlı bileşeni ile devam eder.

2

Veri hazır olduğunu gösterir.

Başlangıç noktası'den daha önce ve daha sonraki bir seçili aralığı bitiş noktası değişiklik veri yakalama kayıt vardır.

Döngü için kapsayıcı yürütme geçirir ve artımlı yük başlatır.

3

Tüm kullanılabilir değişiklik veri ilk yük gösterir.

Koşul mantığını sadece bu amaç için kullanılan bir özel paket değişken bu değeri alır.

Döngü için kapsayıcı yürütme geçirir ve artımlı yük başlatır.

5

TimeoutCeiling ulaşmış olduğunu gösterir.

Döngü için verileri belirtilen sayıda test etti ve veriler hala kullanılabilir değil. Bu sınama veya benzer bir test olmadan, paket sonsuza kadar çalışabilir.

Yürütme zaman aşımı kaydeder isteğe bağlı bileşeni ile devam eder.

Sorgu için sql Yürüt görev değişikliği veri hazır olup yapılandırmak için

  1. sql Yürüt görev için döngü kapsayıcı içinde ekleyin.

  2. İçinde Yürütme sql görev Düzenleyicisi, Genel sayfasında, aşağıdaki seçenekleri işaretleyin:

    1. İçin ResultSetseçin tek satır.

    2. Geçerli bir kaynak veritabanı bağlantısını yapılandırın.

    3. İçin SQLSourceTypeseçin doğrudan giriş.

    4. İçin SQLStatement, aşağıdaki sql deyimini girin:

      declare @DataReady int, @TimeoutCount int
      
      if not exists (select tran_end_time from cdc.lsn_time_mapping
              where tran_end_time > ?  )
          select @DataReady = 0
      else
          if ? = 0
              select @DataReady = 3 
      else
          if not exists (select tran_end_time from cdc.lsn_time_mapping
                  where tran_end_time <= ? )
              select @DataReady = 1 
      else
          select @DataReady = 2
      
      select @TimeoutCount = ?
      if (@DataReady = 0)
          select @TimeoutCount = @TimeoutCount + 1
      else
          select @TimeoutCount = 0
      
      if (@TimeoutCount > ?)
          select @DataReady = 5
      
      select @DataReady as DataReady, @TimeoutCount as TimeoutCount
      
      declare @DataReady int, @TimeoutCount int
      
      if not exists (select tran_end_time from cdc.lsn_time_mapping
              where tran_end_time > ?  )
          select @DataReady = 0
      else
          if ? = 0
              select @DataReady = 3 
      else
          if not exists (select tran_end_time from cdc.lsn_time_mapping
                  where tran_end_time <= ? )
              select @DataReady = 1 
      else
          select @DataReady = 2
      
      select @TimeoutCount = ?
      if (@DataReady = 0)
          select @TimeoutCount = @TimeoutCount + 1
      else
          select @TimeoutCount = 0
      
      if (@TimeoutCount > ?)
          select @DataReady = 5
      
      select @DataReady as DataReady, @TimeoutCount as TimeoutCount
      
  3. Tarih Parametre eşleme sayfası Yürütme sql görev Düzenleyicisi, aşağıdaki eşlemeleri yapın:

    1. ExtractEndTime değişkeni 0 parametre eşleyin.

    2. Parametre 1 IntervalID değişken eşleyin.

    3. Parametre 2 ExtractStartTime değişken eşleyin.

    4. Parametre 3 TimeoutCount değişken eşleyin.

    5. Parametre 4 TimeoutCeiling değişken eşleyin.

  4. Tarih Sonuç kümesi sayfası Yürütme sql görev Düzenleyicisi, DataReady sonucu DataReady değişkeni ve TimeoutCount sonuç TimeoutCount değişken eşleyin.

Değişiklik veri hazır olana kadar bekleme

Değişiklik veri hazır değilse bir gecikme uygulamak için birkaç yöntem kullanabilirsiniz. Aşağıdaki iki yordamdan Script görev veya sql Yürüt görev gecikme uygulamak için nasıl kullanılacağını göstermektedir.

[!NOT]

Önceden derlenmiş komut dosyası, sql Yürüt görev daha az yük doğurur.

Bir kod görevini kullanarak bir gecikme uygulamak için

  1. Döngü için kapsayıcı içinde kod görev ekleyin.

  2. sql Yürüt görev değişikliği veri Yeni Script görev hazır olup olmadığını belirlemek için sorguladığı bağlanın.

  3. sql Yürüt görev bağlayan Script görev önceliği kısıtlaması için açık Önceliği kısıtlaması Düzenleyicisi ve aşağıdaki seçenekleri belirleyin:

    1. İçin Değerlendirme işlemseçin ifade ve kısıtlama.

    2. İçin değeriseçin başarı.

      Kısıtlama değeri başarı önceki görev başarısı için başvurur. Bu durumda, sql Yürüt görev başarısı.

    3. İçin ifade, girmek @DataReady == 0 && @TimeoutCount <= @TimeoutCeiling.

    4. Seçin mantıksal and Tüm kısıtlamaları doğru olarak değerlendirmek gerekir, seçili değilse.

  4. İçinde Komut dosyası görev Düzenleyicisi, Script sayfası için ReadOnlyVariablesseçin User::DelaySeconds tamsayı değişkeni listeden.

  5. İçinde Komut dosyası görev Düzenleyicisi, Script sayfa'yı Komut dosyası Düzenle komut dosyası geliştirme ortamı açmak için.

  6. Ana yordamda aşağıdaki kod satırlarını birini girin:

    • C# programlama, aşağıdaki kod satırını girin:

      System.Threading.Thread.Sleep((int)Dts.Variables["DelaySeconds"].Value * 1000);
      
      System.Threading.Thread.Sleep((int)Dts.Variables["DelaySeconds"].Value * 1000);
      

      - veya -

    • Sen de programlama Visual Basic, aşağıdaki kod satırını girin:

      System.Threading.Thread.Sleep(Ctype(Dts.Variables("DelaySeconds").Value, Integer) * 1000)
      
      System.Threading.Thread.Sleep(Ctype(Dts.Variables("DelaySeconds").Value, Integer) * 1000)
      

      [!NOT]

      Thread.SleepYöntemi beklediği milisaniye olarak belirtilen bağımsız değişken.

  7. Varsayılan satır döndüren kodu bırakın DtsExecResult.SuccessJavaScript yürütülmesine

  8. Komut dosyası geliştirme ortamı kapatın ve Komut dosyası görev Düzenleyicisi.

Bir sql Yürüt görevini kullanarak bir gecikme uygulamak için

  1. sql Yürüt görev için döngü kapsayıcı içinde ekleyin.

  2. sql Yürüt görev değişikliği veri yeni sql Yürüt görev hazır olup olmadığını belirlemek için sorguladığı bağlanın.

  3. İki sql Yürüt görevleri bağlayan önceliği kısıtlaması için açık Önceliği kısıtlaması Düzenleyicisi ve aşağıdaki seçenekleri belirleyin:

    1. İçin Değerlendirme işlemseçin ifade ve kısıtlama.

    2. İçin değeriseçin başarı.

      Kısıtlama değeri başarı önceki sql Yürüt görev başarısı için başvurur.

    3. İçin ifade, girmek @DataReady == 0.

    4. Seçin mantıksal and Tüm kısıtlamaları doğru olarak değerlendirmek gerekir, seçili değilse.

      Bu seçim, koşul, kısıtlama ve ifade olması gerektiğini doğru gerektirir.

  4. İçinde Yürütme sql görev Düzenleyicisi, Genel sayfasında, aşağıdaki seçenekleri işaretleyin:

    1. İçin ResultSetseçin tek satır.

    2. Geçerli bir kaynak veritabanı bağlantısını yapılandırın.

    3. İçin SQLSourceTypeseçin doğrudan giriş.

    4. İçin SQLStatement, aşağıdaki sql deyimini girin:

      WAITFOR DELAY ?
      
      WAITFOR DELAY ?
      
  5. Tarih Parametre eşleme sayfa editörü, DelaySeconds dize değişkeni 0 parametre eşleyin.

Bir hata koşulu işleme

İsteğe bağlı olarak bir hata veya zaman aşımı koşulu oturum için döngü içinde başka bir bileşen yapılandırabilirsiniz:

  • Bu bileşen hata günlüğünü tutabilir zaman durumu DataReady değişkeni değeri = 1. Bu değer kullanılabilir değişiklik veri seçili aralığı başlamadan önce olduğunu gösterir.

  • Bu bileşen TimeoutCeiling değişken değeri erişildiğinde, zaman aşımı koşulu da oturum açabilirsiniz. Bu değer, döngü için verileri belirtilen sayıda test etti ve veriler hala yok gösterir. Bu sınama veya benzer bir test olmadan, paket sonsuza kadar çalışabilir.

Bir hata koşulu oturum için isteğe bağlı bir kod görev yapılandırmak için

  1. İleti günlüğe yazarak hata veya zaman aşımı rapor isterseniz, paket için günlüğe kaydetmeyi yapılandırma. Daha fazla bilgi için, bkz. Bir paket günlüğü etkinleştirme.

  2. Döngü için kapsayıcı içinde kod görev ekleyin.

  3. sql Yürüt görev değişikliği veri Yeni Script görev hazır olup olmadığını belirlemek için sorguladığı bağlanın.

  4. sql Yürüt görev bağlayan Script görev önceliği kısıtlaması için açık Önceliği kısıtlaması Düzenleyicisi ve aşağıdaki seçenekleri belirleyin:

    1. İçin Değerlendirme işlemseçin ifade ve kısıtlama.

    2. İçin değeriseçin başarı.

      Kısıtlama değeri başarı önceki görev başarısı için başvurur. Bu durumda, sql Yürüt görev başarısı.

    3. İçin ifade, girmek @DataReady == 1 || @DataReady == 5.

    4. Seçin mantıksal and Tüm kısıtlamaları doğru olarak değerlendirmek gerekir, seçili değilse.

      Bu seçim, koşul, kısıtlama ve ifade olması gerektiğini doğru gerektirir.

  5. İçinde Komut dosyası görev Düzenleyicisi, Script Sayfa Düzenleyicisi için ReadOnlyVariablesseçin User::DataReady ve User::ExtractStartTime değerlerine komut kullanılabilir hale getirmek için listeden.

    Belirli sistem değişkenleri (örneğin, System::PackageName) bilgileri günlüğe yazma bilgileri dahil etmek istiyorsanız, bu değişkenleri de seçin.

  6. İçinde Komut dosyası görev Düzenleyicisi, Script sayfa'yı Komut dosyası Düzenle komut dosyası geliştirme ortamı açmak için.

  7. Ana yordamda çağırarak bir hata günlüğe kaydetmek için kod girin Dts.Logyöntemini veya yöntemlerinden birini çağırarak bir olay oluşturmak için Dts.Eventsarabirimi. Döndürerek hatayı paketi bildirmek Dts.TaskResult = Dts.Results.Failure.

    Aşağıdaki örnek, bir ileti günlüğe yazma gösterilmiştir. Daha fazla bilgi için bkz: Script görev günlüğe kaydetme, Olayları Script görev yükseltme, ve Script görev sonuçları döndürülüyor.

        ' User variables.
        Dim dataReady As Integer = _
          CType(Dts.Variables("DataReady").Value, Integer)
        Dim extractStartTime As Date = _
          CType(Dts.Variables("ExtractStartTime").Value, DateTime)
    
        ' System variables.
        Dim packageName As String = _
          Dts.Variables("PackageName").Value.ToString()
        Dim executionStartTime As Date = _
          CType(Dts.Variables("StartTime").Value, DateTime)
    
        Dim eventMessage As New System.Text.StringBuilder()
    
        If dataReady = 1 OrElse dataReady = 5 Then
    
          If dataReady = 1 Then
            eventMessage.AppendLine("Start Time Error")
          Else
            eventMessage.AppendLine("Timeout Error")
          End If
    
          With eventMessage
            .Append("The package ")
            .Append(packageName)
            .Append(" started at ")
            .Append(executionStartTime.ToString())
            .Append(" and ended at ")
            .AppendLine(DateTime.Now().ToString())
            If dataReady = 1 Then
              .Append("The specified ExtractStartTime was ")
              .AppendLine(extractStartTime.ToString())
            End If
          End With
    
          System.Windows.Forms.MessageBox.Show(eventMessage.ToString())
    
          Dts.Log(eventMessage.ToString(), 0, Nothing)
    
          Dts.TaskResult = Dts.Results.Failure
    
        Else
    
          Dts.TaskResult = Dts.Results.Success
    
        End If
    
        ' User variables.
        Dim dataReady As Integer = _
          CType(Dts.Variables("DataReady").Value, Integer)
        Dim extractStartTime As Date = _
          CType(Dts.Variables("ExtractStartTime").Value, DateTime)
    
        ' System variables.
        Dim packageName As String = _
          Dts.Variables("PackageName").Value.ToString()
        Dim executionStartTime As Date = _
          CType(Dts.Variables("StartTime").Value, DateTime)
    
        Dim eventMessage As New System.Text.StringBuilder()
    
        If dataReady = 1 OrElse dataReady = 5 Then
    
          If dataReady = 1 Then
            eventMessage.AppendLine("Start Time Error")
          Else
            eventMessage.AppendLine("Timeout Error")
          End If
    
          With eventMessage
            .Append("The package ")
            .Append(packageName)
            .Append(" started at ")
            .Append(executionStartTime.ToString())
            .Append(" and ended at ")
            .AppendLine(DateTime.Now().ToString())
            If dataReady = 1 Then
              .Append("The specified ExtractStartTime was ")
              .AppendLine(extractStartTime.ToString())
            End If
          End With
    
          System.Windows.Forms.MessageBox.Show(eventMessage.ToString())
    
          Dts.Log(eventMessage.ToString(), 0, Nothing)
    
          Dts.TaskResult = Dts.Results.Failure
    
        Else
    
          Dts.TaskResult = Dts.Results.Success
    
        End If
    
  8. Komut dosyası geliştirme ortamı kapatın ve Komut dosyası görev Düzenleyicisi.

Sonraki Adım

Değişiklik veri hazır olduğunu belirledikten sonra sonraki adım değişiklik verilerini sorgulamak hazırlamaktır.

Sonraki Konu: Sorgu Değiştir veriler için hazırlık

Integration Services simgesi (küçük) Integration Services ile güncel kalın

En son karşıdan yüklemeler, makaleler, örnekler ve Microsoft video yanı sıra topluluk seçili çözümleri için ziyaret Integration ServicesMSDN sayfası:


Bu güncelleştirmelerle ilgili otomatik bildirim almak için, sayfadaki RSS akışlarına abone olun.