Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Yönetilen Örneği
Değişiklik verileri, tablo değerli işlevler (TVF’ler) aracılığıyla değişiklik verisi yakalama tüketicilerine sunulur. Bu işlevlerin tüm sorguları, döndürülen sonuç kümesini geliştirirken dikkate alınması uygun olan Günlük Dizisi Numaraları (LSN) aralığını tanımlamak için iki parametre gerektirir. Aralığı sınırlayan hem üst hem de düşük LSN değerlerinin aralık içinde dahil olduğu kabul edilir.
TVF sorgulamada kullanılacak uygun LSN değerlerini belirlemeye yardımcı olmak için çeşitli işlevler sağlanır. sys.fn_cdc_get_min_lsn işlevi, yakalama örneği geçerlilik aralığıyla ilişkili en küçük LSN'yi döndürür. Geçerlilik aralığı, değişiklik verilerinin yakalama örnekleri için şu anda kullanılabildiği zaman aralığıdır. İşlev sys.fn_cdc_get_max_lsn geçerlilik aralığındaki en büyük LSN'yi döndürür. LSN değerlerini geleneksel bir zaman çizelgesine yerleştirmeye yardımcı olmak için sys.fn_cdc_map_time_to_lsn ve sys.fn_cdc_map_lsn_to_time işlevleri kullanılabilir.
Değişiklik veri yakalaması kapalı sorgu aralıkları kullandığından, değişikliklerin ardışık sorgu pencerelerinde yinelenmediğinden emin olmak için bazen bir dizide sonraki LSN değerinin oluşturulması gerekir. LSN değerinde artımlı ayarlama gerektiğinde sys.fn_cdc_increment_lsn ve sys.fn_cdc_decrement_lsn işlevleri yararlıdır.
LSN Sınırlarını Doğrulama
Bir TVF sorgusunda kullanılmadan önce kullanılacak LSN sınırlarını doğrulamanızı öneririz. Null olan uç noktalar veya bir yakalama örneği için geçerlilik aralığının dışında kalan uç noktalar, bir değişiklik verisi yakalama TVF’si tarafından hata döndürülmesine neden olur.
Örneğin, sorgu aralığını tanımlamak için kullanılan bir parametre geçerli olmadığında veya aralık dışında olduğunda veya satır filtresi seçeneği geçersiz olduğunda, tüm değişiklikler için bir sorgu için aşağıdaki hata döndürülür.
Msg 313, Level 16, State 3, Line 1
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ...
Net changes sorgusu için döndürülen ilgili hata aşağıdaki gibidir:
Msg 313, Level 16, State 3, Line 1
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_net_changes_ ...
Uyarı
Msg 313 iletisinin yanıltıcı olduğu ve hatanın gerçek nedenini iletmediği kabul edilir. Bu hantal kullanım, TVF içinden açıkça bir hata döndürülememesinden kaynaklanır. Bununla birlikte, tam olarak doğru olmasa da tanınabilir bir hata döndürmenin, yalnızca boş bir sonuç döndürmeye kıyasla tercih edilir olduğu değerlendirildi. Boş bir sonuç kümesi, değişiklik döndürmeyen geçerli bir sorgudan ayırt edilemez.
Yetkilendirme hataları, gösterildiği gibi tüm değişiklikleri sorgularken hatalar döndürür:
Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object 'fn_cdc_get_all_changes_...', database 'MyDB', schema 'cdc'.
Net değişiklikler sorgulanırken de aynı durum geçerlidir:
Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object fn_cdc_get_net_changes_...', database 'MyDB', schema 'cdc'.
SQL Server Management Studio'da, bu bilinen TVF hatalarına müdahale etmeyi ve hata hakkında daha anlamlı bilgiler döndürmeyi gösteren bir tanıtım için TRY CATCH Kullanarak Net Değişiklikleri Numaralandırma şablonuna bakın.
Tip
SQL Server Management Studio'da değişiklik veri yakalama şablonlarını bulmak için Görünüm menüsünde Şablon Gezgini'ni seçin, SQL Server Şablonları'nı genişletin ve ardından Veri Yakalamayı Değiştir klasörünü genişletin.
Sorgu İşlevleri
İzlenen kaynak tablonun özelliklerine ve yakalama örneğinin nasıl yapılandırıldığına bağlı olarak, değişiklik verilerini sorgulamak için bir veya iki TVF oluşturulur.
İşlev cdc.fn_cdc_get_all_changes_<capture_instance> belirtilen aralık için gerçekleşen tüm değişiklikleri döndürür. Bu işlev her zaman oluşturulur. Kayıtlar her zaman önce değişikliğin ait olduğu işlemin commit LSN'sine, ardından da değişikliği kendi işlemi içinde sıralayan bir değere göre sıralı olarak döndürülür. Seçilen satır filtresi seçeneğine bağlı olarak, güncelleştirmede son satır döndürülür (satır filtresi seçeneği "tümü") veya güncelleştirmede hem yeni hem de eski değerler döndürülür (satır filtresi seçeneği "tüm güncelleştirme eski").
Kaynak tablo etkinleştirildiğinde,
@supports_net_changesparametresi1olarak ayarlanırsa cdc.fn_cdc_get_net_changes_<capture_instance> işlevi oluşturulur.Uyarı
Bu seçenek yalnızca kaynak tabloda tanımlı bir birincil anahtar varsa veya parametre @index_name benzersiz bir dizini tanımlamak için kullanılmışsa desteklenir.
İşlev,
netchangesdeğiştirilen kaynak tablo satırı başına bir değişiklik döndürür. Belirtilen aralıkta satır için birden fazla değişiklik günlüğe kaydedilirse, sütun değerleri satırın son içeriğini yansıtır. Hedef ortamı güncelleştirmek için gereken işlemi doğru şekilde tanımlamak için TVF'nin hem aralık sırasında satırdaki ilk işlemi hem de satırdaki son işlemi dikkate alması gerekir. 'tümü' satır filtresi seçeneği belirtildiğinde, net changes sorgusu tarafından döndürülen işlemler ekleme, silme veya güncelleştirme (yeni değerler) olur. Birleşik maskenin hesaplanmasının bir maliyeti olduğundan, bu seçenek güncelleştirme maskesini her zaman null olarak döndürür. Bir satırdaki tüm değişiklikleri yansıtan bir toplu maskeye ihtiyacınız varsa , 'tümü maskeli' seçeneğini kullanın. Alt akış işlemede ekleme ve güncelleştirme işlemlerinin ayırt edilmesi gerekmiyorsa, 'tümü birleştirerek' seçeneğini kullanın. Bu durumda işlem değeri yalnızca iki değer alır: silme için 1 ve ekleme veya güncelleştirme olabilecek bir işlem için 5. Bu seçenek, türetilmiş işlemin bir ekleme mi yoksa güncelleştirme mi olması gerektiğini belirlemek için gereken ek işlemleri ortadan kaldırır ve bu farklılaştırma gerekli olmadığında sorgunun performansını artırabilir.
Sorgu işlevinden döndürülen güncelleştirme maskesi, değişiklik verileri satırında değiştirilen tüm sütunları tanımlayan küçük bir gösterimdir. Bu bilgiler genellikle yakalanan sütunların yalnızca küçük bir alt kümesi için gereklidir. Uygulamalar tarafından daha doğrudan kullanılabilen bir biçimde maskeden bilgi ayıklamaya yardımcı olan işlevler kullanılabilir. İşlev sys.fn_cdc_get_column_ordinal belirli bir yakalama örneği için adlandırılmış sütunun sıralı konumunu döndürürken, işlev sys.fn_cdc_is_bit_set işlev çağrısında geçirilen sırayı temel alarak sağlanan maskedeki bitin eşliğini döndürür. Bu iki işlev birlikte güncelleştirme maskesindeki bilgilerin verimli bir şekilde ayıklanıp değişiklik verileri isteğiyle döndürülebilmesini sağlar. SQL Server Management Studio'da, bu işlevlerin nasıl kullanıldığını gösteren bir gösterim için Tümünü Maske ile Kullanarak Net Değişiklikleri Listeleme şablonuna bakın.
Sorgu İşlevi Senaryoları
Aşağıdaki bölümlerde, cdc.fn_cdc_get_all_changes_<capture_instance> ve cdc.fn_cdc_get_net_changes_<capture_instance> sorgu işlevleri kullanılarak change data capture verilerinin sorgulanmasına ilişkin yaygın senaryolar açıklanmaktadır.
Yakalama örneği geçerlilik aralığındaki tüm değişikliklerin sorgulanması
Değişiklik verileri için en basit istek, yakalama örneğinin geçerlilik aralığındaki tüm geçerli değişiklik verilerini döndüren istektir. Bu isteği yapmak için önce geçerlilik aralığının alt ve üst LSN sınırlarını belirleyin. Ardından, bu değerleri kullanarak cdc.fn_cdc_get_all_changes_<capture_instance> veya cdc.fn_cdc_get_net_changes_<capture_instance> sorgu işlevine geçirilen @from_lsn ve @to_lsn parametrelerini belirleyin. alt sınırı elde etmek için işlev sys.fn_cdc_get_min_lsn kullanın ve üst sınırı elde etmek için sys.fn_cdc_get_max_lsn . SQL Server Management Studio'da, sorgu işlevini kullanarak tüm geçerli değişiklikleri sorgulamak üzere örnek kod cdc.fn_cdc_get_all_changes_<capture_instance> şablonuna bakın. SQL Server Management Studio'da, cdc.fn_cdc_get_net_changes_<capture_instance> işlevinin kullanımına benzer bir örnek için Geçerli Aralık için Net Değişiklikleri Numaralandır şablonuna bakın.
Son Değişiklik Kümesinden Bu Yana Yapılan Tüm Yeni Değişiklikleri Sorgulama
Tipik uygulamalar için değişiklik verilerini sorgulama işlemi devam eden bir işlemdir ve son istek sonrasında gerçekleşen tüm değişiklikler için düzenli istekler yapılır. Bu tür sorgularda, geçerli sorgunun alt sınırlarını önceki sorgunun üst sınırından türetmek için işlev sys.fn_cdc_increment_lsn kullanabilirsiniz. Bu yöntem, sorgu aralığı her zaman her iki uç noktanın da ara aralığına dahil edildiği kapalı bir aralık olarak kabul edildiğinden hiçbir satırın yinelenmemesini sağlar. Ardından, yeni istek aralığı için yüksek uç noktayı elde etmek için sys.fn_cdc_get_max_lsn işlevini kullanın. SQL Server Management Studio'da, son istekteki tüm değişiklikleri almak üzere sorgu penceresini sistematik olarak taşımak üzere örnek kod için Önceki İstek'ten Bu Yana Tüm Değişiklikleri Numaralandırma şablonuna bakın.
Şimdiye KadarKi Tüm Yeni Değişiklikleri Sorgula
Sorgu işlevi tarafından döndürülen değişikliklere uygulanan tipik bir kısıtlama, yalnızca geçerli tarih ve saate kadar önceki istek arasında gerçekleşen değişiklikleri eklemektir. Bu sorgu için, işlevi sys.fn_cdc_increment_lsn alt sınırı belirlemek için @from_lsn önceki istekte kullanılan değere uygulayın. Zaman aralığındaki üst sınır belirli bir zaman noktası olarak ifade edildiğinden, sorgu işlevi tarafından kullanılabilmesi için önce bir LSN değerine dönüştürülmesi gerekir. Datetime değerinin karşılık gelen bir LSN değerine dönüştürülebilmesi için, yakalama işleminin belirtilen üst sınır üzerinden işlenen tüm değişiklikleri işlediğinden emin olmanız gerekir. Bu, koşulları sağlayan tüm değişikliklerin değişiklik tablosuna aktarılmış olmasını sağlamak için gereklidir. Bunu gerçekleştirmenin bir yolu, herhangi bir veritabanı değişiklik tablosu için kaydedilen geçerli maksimum işleme lsn değerinin istek aralığının istenen bitiş saatini aşıp aşmadığını düzenli aralıklarla denetleyen bir bekleme döngüsü yapılandırmaktır.
Gecikme döngüsü, yakalama işleminin ilgili tüm günlük girdilerini zaten işlediğini doğruladıktan sonra, LSN değeri cinsinden ifade edilen yeni üst uç noktayı belirlemek için sys.fn_cdc_map_time_to_lsn işlevini kullanın. Belirtilen süre boyunca işlenen tüm girişlerin alındığından emin olmak için işlevini sys.fn_cdc_map_time_to_lsnçağırın ve 'en büyük küçük veya eşit' seçeneğini kullanın.
Uyarı
Hareketsizlik dönemlerinde, yakalama sürecinin değişiklikleri belirli bir taahhüt zamanına kadar işlediğini belirtmek için cdc.lsn_time_mapping tablosuna sahte bir girdi eklenir. Bu, işlenecek yakın tarihli değişiklikler olmadığında, yakalama işleminin geride kalmış gibi görünmesini önler.
Şablon Tüm Değişiklikleri Şimdiye Kadar Numaralandırır , değişiklik verilerini sorgulamak için önceki stratejinin nasıl kullanılacağını gösterir.
Tüm Değişiklikler Sonuç Kümesine İşleme Süresi Ekleme
Veritabanı değişiklik tablosunda ilişkili bir girdisi bulunan her işlemin tamamlama zamanı, cdc.lsn_time_mapping tablosunda bulunabilir. Tüm değişikliklere yönelik bir istekte döndürülen __$start_lsn değerini bir cdc.lsn_time_mapping tablo girdisinin start_lsn değeriyle birleştirerek, değişiklik verileriyle birlikte tran_end_time değerini döndürebilir ve değişikliği kaynaktaki işlemin işleme alma zamanı ile damgalayabilirsiniz.
Tüm Değişiklikler Sonuç Kümesine İşleme Süresi Ekle şablonu, bu birleştirmenin nasıl gerçekleştirilacağını gösterir.
Değişiklik Verilerini Aynı İşlemdeki Diğer Verilerle Birleştirme
Bazen değişiklik verilerini kaynakta işlendiğinde işlem hakkında toplanan diğer bilgilerle birleştirmek yararlı olur.
tran_begin_lsn Tablodaki cdc.lsn_time_mapping sütun, böyle bir birleştirme gerçekleştirmek için gereken bilgileri sağlar. Kaynağın güncelleştirmesi gerçekleştiğinde, sistem dinamik görünümünden database_transaction_begin_lsn değerinin sys.dm_tran_database_transactions değişiklik verileriyle birleştirilecek diğer bilgilerle birlikte kaydedilmesi gerekir.
database_transaction_begin_lsn ve tran_begin_lsn değerlerini karşılaştırmak için fn_convertnumericlsntobinary işlevini kullanın. Bu işlevi oluşturmaya ilişkin kod, İşlev fn_convertnumericlsntobinaryOluştur şablonunda kullanılabilir.
Belirli Bir tran_begin_lsn ile Tüm Değişiklikleri Döndür şablonu, birleştirme işlemini nasıl etkilediğini gösterir.
DateTime Sarmalayıcı İşlevlerini Kullanarak Sorgulama
Değişiklik verilerini sorgulamaya yönelik tipik bir uygulama senaryosu, tarih saat değerleriyle sınırlanmış bir kayan pencere kullanarak düzenli aralıklarla değişiklik verileri istemektir. Bu tüketici sınıfı için değişiklik verisi yakalama, değişiklik verisi yakalama sorgu işlevleri için özel sarmalayıcı işlevler oluşturan betikleri üreten sys.sp_cdc_generate_wrapper_function saklı yordamını sağlar. Bu özel sarmalayıcılar, sorgu aralığının tarih saat çifti olarak ifade edilmesine olanak sağlar.
Saklı yordama yönelik çağrı seçenekleri, çağıranın erişebildiği tüm yakalama örnekleri ya da yalnızca belirtilen bir yakalama örneği için sarmalayıcılar oluşturulmasına olanak tanır. Desteklenen seçenekler, yakalama aralığının yüksek uç noktasının açık mı yoksa kapalı mı olacağını, kullanılabilir yakalanan sütunlardan hangisinin sonuç kümesine dahil edilmesi gerektiğini ve eklenen sütunlardan hangilerinin ilişkili güncelleştirme bayraklarına sahip olacağını belirtme özelliğini de içerir. Prosedür, iki sütun içeren bir sonuç kümesi döndürür: yakalama örneği adından türetilebilen oluşturulmuş fonksiyon adı ve sarmalayıcı saklı prosedür için CREATE deyimi. Tüm değişiklikler sorgusunu saran işlev her zaman oluşturulur. Yakalama örneği oluşturulurken @supports_net_changes parametresi ayarlandıysa, net değişiklikler işlevini sarmalayan işlev de oluşturulur.
Sarma saklı yordamları için CREATE deyimlerini üretmek amacıyla betik üretme saklı yordamını çağırmak ve işlevleri oluşturmak için ortaya çıkan oluşturma betiklerini çalıştırmak uygulama tasarımcısının sorumluluğundadır. Yakalama örneği oluşturulduğunda bu otomatik olarak gerçekleşmez.
Datetime sarmalayıcıları kullanıcıya aittir ve çağıranın varsayılan şemasında oluşturulmaz. Oluşturulan işlev çoğu kullanıcı için değişiklik yapılmadan uygundur. Ancak, işlevi oluşturmadan önce oluşturulan betikte her zaman daha fazla özelleştirme uygulanabilir.
Tüm değişiklikler sorgusunu sarmalayan işlevin adı, fn_all_changes_ ifadesinin ardından yakalama örneği adının gelmesiyle oluşturulur. Net changes sarmalayıcısı için kullanılan önek fn_net_changes_ öğesidir. Her iki fonksiyon da, ilgili değişiklik verisi yakalama TVF'leri gibi, üç parametre alır. Ancak sarmalayıcılar için sorgu aralığı, iki LSN değeriyle değil, iki tarih-saat değeriyle sınırlandırılır. Her iki işlev kümesi için de @row_filter_option parametresi aynıdır.
Oluşturulan sarmalayıcı işlevler, değişiklik verisi yakalama zaman çizelgesinde sistematik olarak ilerlemek için aşağıdaki kuralı destekler: Önceki aralıktaki @end_time parametresinin, sonraki aralıktaki @start_time parametresi olarak kullanılması beklenir. Sarmalayıcı işlevi, tarih saat değerlerini LSN değerleriyle eşlemeyi ve bu kurala uyulup uyulmadığının veri kaybı olmamasını veya tekrarlanmamasını sağlar.
Sarmalayıcılar, belirtilen sorgu penceresinde kapalı bir üst sınırı veya açık bir üst sınırı desteklemek için oluşturulabilir. Yani çağıran taraf, commit zamanı çıkarma aralığının üst sınırına eşit olan girdilerin aralığa dahil edilip edilmeyeceğini belirtebilir. Varsayılan olarak üst sınır eklenir.
Oluşturulan sorgu TVF'leri, @from_lsn değeri veya @to_lsn değeri için null bir değer sağlandığında başarısız olurken, datetime sarmalayıcı işlevleri, datetime sarmalayıcılarının mevcut değişikliklerin tümünü döndürebilmesi için null kullanır. Yani, sorgu penceresinin alt uç noktası olarak datetime sarmalayıcısına null geçirilirse, sorgu TVF’sine uygulanan temel alınan SELECT ifadesinde yakalama örneğinin geçerlilik aralığındaki alt uç nokta kullanılır. Benzer şekilde, sorgu penceresinin üst uç noktası olarak null geçirilirse, sorgu TVF'sinden seçim yapılırken yakalama örneği geçerlilik aralığının yüksek uç noktası kullanılır.
Sarmalayıcı işlevi tarafından döndürülen sonuç kümesi, istenen tüm sütunları ve ardından bir işlem sütununu içerir ve satırla ilişkili işlemi tanımlamak için bir veya iki karakter olarak yeniden kodlanır. Güncelleştirme bayrakları istendiyse, işlem kodundan sonra parametresinde @update_flag_list belirtilen sırada bit sütunları olarak görünürler. Oluşturulan tarih saat sarmalayıcılarını özelleştirmeye yönelik arama seçenekleri hakkında bilgi için bkz. sys.sp_cdc_generate_wrapper_function (Transact-SQL).
Güncelleştirme Bayrağı ile Bir Sarmalayıcı TVF Oluşturma şablonu, oluşturulan bir sarmalayıcı işlevin, net changes sorgusunun döndürdüğü sonuç kümesine belirtilen bir sütuna yönelik bir güncelleştirme bayrağı ekleyecek şekilde nasıl özelleştirileceğini gösterir. Bir Şema için CDC Sarmalayıcı TVF'lerini Örnekleme şablonu, belirli bir veritabanı şemasındaki kaynak tablolar için oluşturulan tüm yakalama örneklerine yönelik Sorgu TVF'leri için TarihSaat Sarmalayıcılarının nasıl örnekleneceğini gösterir.
Değişiklik verilerini sorgulamak için tarih saat sarmalayıcı kullanan bir örnek için SQL Server Management Studio'da Güncelleştirme Bayraklarıyla Sarmalayıcı Kullanarak Net Değişiklik Alma şablonuna bakın. Bu şablon, sarmalayıcı güncelleştirme bayraklarını döndürecek şekilde yapılandırıldığında sarmalayıcı işleviyle net değişiklikleri sorgulamayı gösterir. Temel sorgu işlevinin güncelleştirmede null olmayan bir güncelleştirme maskesi döndürmesi için 'tümü maskeli' satır filtresi seçeneği gereklidir. Altta yatan LSN tabanlı sorgu yürütülürken işlevin, yakalama örneğinin geçerlilik aralığına ait alt ve üst uç noktaları kullanmasını belirtmek için hem alt hem de üst datetime aralığı sınırları için null değerler geçirilir. Sorgu, yakalama örneği için geçerli aralık içinde gerçekleşen bir kaynak satırda yapılan her değişiklik için bir satır döndürür.
Yakalama Örnekleri Arasında Geçiş Yapmak için DateTime Sarmalayıcı İşlevlerini Kullanma
Değişiklik veri yakalama, tek bir izlenen kaynak tablo için en çok iki yakalama örneğini destekler. Bu özelliğin asıl kullanımı, veri tanımı dili (DDL) kaynak tabloya değiştiğinde birden çok yakalama örneği arasında bir geçişin izlenmesi için kullanılabilir sütunlar kümesini genişletmesidir. Yeni bir yakalama örneğine geçiş yaparken, temel alınan sorgu işlevlerinin adlarındaki değişikliklerden daha yüksek uygulama düzeylerini korumanın bir yolu, temel alınan çağrıyı sarmalayan bir sarmalayıcı işlevi kullanmaktır. Ardından sarmalayıcı işlevinin adının aynı kaldığından emin olun. Geçiş yapılacağı zaman, eski sarmalayıcı işlev kaldırılabilir ve onun yerine yeni sorgu işlevlerini kullanan, aynı ada sahip yeni bir işlev oluşturulabilir. İlk olarak oluşturulan betiği, aynı ada sahip bir sarmalayıcı işlev oluşturacak şekilde değiştirerek, uygulamanın üst katmanlarını etkilemeden yeni bir yakalama örneğine geçiş yapabilirsiniz.