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
Tablo değerli işlevler (TVF' ler) aracılığıyla veri yakalama tüketicilerini değiştirmek için değişiklik verileri kullanılabilir hale getirilir. 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. Yakalama örneği için geçerlilik aralığının dışında olan null uç noktalar veya uç noktalar, değişiklik veri yakalama TVF'sinin bir hata döndürmesini zorlar.
Ö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 garip kullanım, TVF'nin içinden açık bir hata oluşturamamasından kaynaklanır. Bununla birlikte, yanlışsa, hatanın yalnızca boş bir sonuç döndürmek için tercih edildiği kabul edilir. 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. Girdiler her zaman önce değişikliğin işlem işleme LSN'sine ve ardından değişikliği işlemi içinde sıralayan bir değere göre sıralanı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").
cdc.fn_cdc_get_net_changes_<capture_instance> işlevi, parametre
@supports_net_changeskaynak tablo etkinleştirildiğinde olarak ayarlandığında1oluş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. Toplama maskesi hesaplamayla ilişkili bir maliyet 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. Aşağı akış işleme, eklemelerin ve güncelleştirmelerin ayırt edilmesine gerek görmüyorsa , 'tümü birleştirme ile' 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, ve cdc.fn_cdc_get_net_changes_<capture_instance>sorgu işlevlerini cdc.fn_cdc_get_all_changes_<capture_instance> kullanarak değişiklik verilerini yakalama verilerini sorgulamaya yönelik yaygın senaryolar açıklanmaktadır.
Yakalama Örneği Geçerlilik Aralığı içindeki Tüm Değişiklikler için Sorgu
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, parametreleri @from_lsn tanımlamak ve @to_lsn veya sorgu işlevine cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_changes_<capture_instance>geçirilirken bu değerleri kullanın. 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 cdc.fn_cdc_get_all_changes_<capture_instance>kullanarak tüm geçerli değişiklikleri sorgulamak üzere örnek kod için Geçerli Aralık için Tüm Değişiklikleri Numaralandırma şablonuna bakın. SQL Server Management Studio'da, işlevini cdc.fn_cdc_get_net_changes_<capture_instance>kullanmaya benzer bir örnek için Geçerli Aralık için Net Değişiklikleri Numaralandırma ş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, tüm uygun değişikliklerin değişiklik tablosuna yayılması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 tüm ilgili günlük girişlerini zaten işlediğini doğruladıktan sonra, LSN değeri olarak ifade edilen yeni yüksek uç noktayı belirlemek için işlev sys.fn_cdc_map_time_to_lsn 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ı
İşlem yapılmadığı dönemlerde, yakalama işleminin belirli bir işleme süresine kadar değişiklikleri işlediğini işaretlemek için tabloya cdc.lsn_time_mapping bir sahte girdi eklenir. Bu, yalnızca işlenmesi gereken son değişiklikler olmadığında yakalama işleminin geride kaldığının 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 girişe sahip her işlemin işleme süresi tablo cdc.lsn_time_mapping kullanılabilir. Bir istekte döndürülen __$start_lsn değerini bir tablo girişinin start_lsn değeriyle cdc.lsn_time_mapping birleştirerek, değişiklik verilerinin yanı sıra tran_end_time döndürerek değişikliğin kaynaktaki işleme süresiyle damgalanmasını sağlayabilirsiniz.
Tüm Değişiklikler Sonuç Kümesine İşleme Süresi Ekle şablonu, bu birleştirmenin nasıl gerçekleştirilacağını gösterir.
Aynı İşlemden Verileri 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. ve tran_begin_lsn değerlerini karşılaştırmak database_transaction_begin_lsn için işlevini fn_convertnumericlsntobinary kullanın. Bu işlevi oluşturmaya ilişkin kod, İşlev fn_convertnumericlsntobinaryOluştur şablonunda kullanılabilir. Verilen ile tran_begin_lsnTüm Değişiklikleri Döndür şablonu birleştirmeyi nasıl etkileyeceğ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 veri yakalama, değişiklik veri yakalama sorgu işlevleri için özel sarmalayıcı işlevleri oluşturmak üzere betikler oluşturan saklı yordam sys.sp_cdc_generate_wrapper_function sağlar. Bu özel sarmalayıcılar, sorgu aralığının tarih saat çifti olarak ifade edilmesine olanak sağlar.
Saklı yordam için çağrı seçenekleri, çağıranın erişimi olan tüm yakalama örnekleri veya yalnızca belirli bir yakalama örneği için sarmalayıcıların oluşturulmasını sağlar. 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. Yordam, iki sütun içeren bir sonuç kümesi döndürür: yakalama örneği adından türetilebilen oluşturulan işlev adı ve sarmalayıcı saklı yordamı için create deyimi. Tüm değişiklikler sorgusunu sarmalama işlevi her zaman oluşturulur.
@supports_net_changes Yakalama örneği oluşturulduğunda parametresi ayarlandıysa, net changes işlevini sarmalama işlevi de oluşturulur.
Sarmalayıcı saklı yordamları için create deyimlerini oluşturmak ve işlevleri oluşturmak üzere sonuçta elde edilen oluşturma betiklerini yürütmek için betik oluşturma saklı yordamını çağı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 fn_all_changes_ sarmalama işlevinin adını yakalama örneği adı izler. Net changes sarmalayıcısı için kullanılan ön ek şeklindedir fn_net_changes_. her iki işlev de ilişkili değişiklik veri yakalama TVF'leri gibi üç bağımsız değişken alır. Ancak sarmalayıcılar için sorgu aralığı iki LSN değeri yerine iki tarih saat değeriyle sınırlanır. her @row_filter_option iki işlev kümesinin parametresi de aynıdır.
Oluşturulan sarmalayıcı işlevleri, değişiklik verilerini yakalama zaman çizelgesini sistematik olarak yürümek için aşağıdaki kuralı destekler: Önceki aralığın parametresinin sonraki aralığın @start_time parametresi olarak kullanılması beklenir@end_time. 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. Başka bir ifadeyle çağıran, işleme süresi ayıklama aralığının üst sınırına eşit olan girişlerin aralığın içine dahil edilip edilmeyeceğini belirtebilir. Varsayılan olarak üst sınır eklenir.
Oluşturulan sorgu TVF'leri değer veya @to_lsn değer için null değer sağlanırsa başarısız olsa da@from_lsn, datetime sarmalayıcı işlevleri null kullanarak datetime sarmalayıcılarının tüm geçerli değişiklikleri döndürmesini sağlar. Başka bir ifadeyle, sorgu penceresinin düşük uç noktası olarak null değeri datetime sarmalayıcısına geçirilirse, yakalama örneği geçerlilik aralığının düşük uç noktası sorgu TVF'sine uygulanan temel SELECT alınan deyimde 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).
Şablon Güncelleştirme Bayrağı ile Sarmalayıcı TVF Örneği Oluşturma, belirtilen bir sütun için güncelleştirme bayrağını net changes sorgusu tarafından döndürülen sonuç kümesine eklemek üzere oluşturulan sarmalayıcı işlevini özelleştirmeyi gösterir. Şablon bir Şema için CDC Sarmalayıcı TVF'lerinin örneğini oluşturma, belirli bir veritabanı şemasındaki kaynak tablolar için oluşturulan tüm yakalama örnekleri için Sorgu TVF'leri için Datetime Sarmalayıcılarının nasıl örnek oluşturulduğunu 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. Temel alınan LSN tabanlı sorguyu gerçekleştirirken işleve düşük uç noktayı ve yakalama örneğinin geçerlilik aralığının yüksek uç noktasını kullanması için hem alt hem de üst tarih 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. Anahtar gerçekleştiğinde, eski sarmalayıcı işlevi bırakılabilir ve yeni sorgu işlevlerine başvuran aynı ada sahip yeni bir işlev oluşturulabilir. Oluşturulan betiği değiştirerek aynı ada sahip bir sarmalayıcı işlevi oluşturarak, daha yüksek uygulama katmanlarını etkilemeden yeni bir yakalama örneğine geçiş yapabilirsiniz.