cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

Şunlar için geçerlidir: SQL Server

Belirlenen Log Sequence Numbers (LSN) aralığında değiştirilen her kaynak satırı için bir net değişim satırı döndürür.

Bekle, LSN nedir? SQL Server işlem günlüğündeki her kayıt, bir log dizisi numarası (LSN) ile benzersiz şekilde tanımlanır. LSN'ler, LSN2 LSN1'den büyük ise, LSN2 tarafından bahsedilen log kaydında tanımlanan değişim, log kaydı LSN'nin tanımladığı değişimden sonra gerçekleştiği şekilde sıralanır.

Önemli bir olayın gerçekleştiği bir log kaydının LSN'si, doğru geri yükleme dizilerini oluşturmak için faydalı olabilir. LSN'ler sıralı olduğu için, eşitlik ve eşitsizlik açısından karşılaştırabilirsiniz (yani, <, >, =, <=, =, =). > Bu tür karşılaştırmalar, restore dizilerini oluştururken faydalıdır.

LSN aralığında bir kaynak satırda birden fazla değişiklik olduğunda, aşağıda açıklanan sayma fonksiyonu tarafından satırın nihai içeriğini yansıtan tek bir satır döner. Örneğin, bir işlem kaynak tabloya bir satır eklerse ve LSN aralığındaki sonraki bir işlem o satırdaki bir veya daha fazla sütunu günlerlerse, fonksiyon yalnızca güncellenmiş sütun değerlerini içeren bir satır döner.

Bu sayma fonksiyonu, değişim veri yakalama için kaynak tablo etkinleştirildiğinde ve ağ takibi belirlendiğinde oluşturulur. Ağ takibi etkinleştirmek için, kaynak tablonun birincil anahtarı veya benzersiz bir indeks olması gerekir. Fonksiyon adı türetilir ve capture_instance>, kaynak tablo değişiklik veri yakalama için etkinleştirildiğinde yakalama örneği için belirtilen değer cdc.fn_cdc_get_net_changes_<capture_instance><olan formatı kullanır. Daha fazla bilgi için sys.sp_cdc_enable_table (Transact-SQL) bölümine bakınız.

Transact-SQL söz dizimi kuralları

Syntax

  
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  
  
<row_filter_option> ::=  
{ all  
 | all with mask  
 | all with merge  
}  

Arguments

from_lsn

Sonuç setine dahil edilecek LSN aralığının en düşük uç noktasını temsil eden LSN. from_lsnikili (10).

CDC'de sadece sıralar var.[ capture_instance]_CT değeri __$start_lsn değeri from_lsn'den büyük veya eşit olan değişim tablosu sonuç kümesine dahil edilir.

to_lsn

Sonuç setine dahil edilecek LSN aralığının en yüksek uç noktasını temsil eden LSN. to_lsn,ikili (10) .

CDC'de sadece sıralar var.[ capture_instance]_CT değeri __$start_lsn değeri from_lsn'den az veya eşit ya da to_lsn'ye eşit olan değişim tablosu sonuç kümesine dahil edilir.

<row_filter_option> ::= { hepsi | hepsi maske ile | hepsi birleşme ile }

Meta veri sütunlarının içeriğini ve sonuç kümesinde döndürülen satırları yöneten bir seçenek. Aşağıdaki seçeneklerden biri olabilir:

tümü
Satır üzerindeki son değişikliğin LSN'sini ve metaveri sütunlarındaki __$start_lsn ve __$ operasyonunda satırı uygulamak için gereken işlemin LSN'sini döndürür. __$update_mask sütunu her zaman NULL'dur.

hepsi maske ile
Satır üzerindeki son değişikliğin LSN'sini ve metaveri sütunlarındaki __$start_lsn ve __$ operasyonunda satırı uygulamak için gereken işlemin LSN'sini döndürür. Ayrıca, bir güncelleme işlemi (__$operation = 4) döndürdüğünde, güncellemede değiştirilen yakalanan sütunlar, __$update_mask içindeki değerle işaretlenir.

hepsi birleşme ile
Meta veri sütunlarındaki satırdaki son değişikliğin LSN'sini __$start_lsn döndürür. __$ işlemi sütunu iki değerden biri olacaktır: 1 silmek için ve 5, değişikliği uygulamak için gereken işlemin ya ekleme ya da güncelleme olduğunu belirtmek için. __$update_mask sütunu her zaman NULL'dur.

Belirli bir değişiklik için kesin işlemi belirleme mantığı sorgu karmaşıklığını artırdığından, bu seçenek, değişiklik verisini uygulamak için gereken işlemin ya ekleme ya da güncelleme olduğunu belirtmek için yeterli olduğunda, sorgu performansını artırmak için tasarlanmıştır; ancak ikisi arasında açıkça ayrım yapmak zorunda değildir. Bu seçenek, birleştirme operasyonunun doğrudan mevcut olduğu hedef ortamlarda en cazip özelliktir.

Tablo geri getirildi

Sütun adı Veri türü Description
__$start_lsn binary(10) Değişiklik için işleme işlemiyle ilişkili LSN.

Aynı işlemde yapılan tüm değişiklikler aynı taahhüt LSN'yi paylaşır. Örneğin, kaynak tablodaki bir güncelleme işlemi iki satırdaki iki sütunu değiştirirse, değişim tablosu dört satır içerir ve her biri aynı __$start_lsnvalue'a sahiptir.
__$operasyon int Değişiklik verilerinin satırını hedef veri kaynağına uygulamak için gereken veri işleme dili (DML) işlemini tanımlar.

Eğer row_filter_option parametresinin değeri maske ile birlikte hepsi veya tamamı ise, bu sütundaki değer aşağıdaki değerlerden biri olabilir:

1 = sil

2 = ekle

4 = güncelleme

Eğer row_filter_option parametresinin değeri birleştirme ile birlikteyse, bu sütundaki değer aşağıdaki değerlerden biri olabilir:

1 = sil

5 = ekle veya güncelleme
__$update_mask varbinary(128) Yakalama örneği için tanımlanan her yakalanan sütuna karşılık gelen bit içeren bir bit maskesi. Bu değer, __$işlem = 1 veya 2 olduğunda tüm tanımlanmış bitler 1 olarak ayarlanmıştır. __$ operasyonu = 3 veya 4 olduğunda, sadece değişen sütunlara karşılık gelen bitler 1 olarak ayarlanır.
<yakalanan kaynak tablo sütunları> değişkenlik gösterir İşlev tarafından döndürülen kalan sütunlar, yakalama örneği oluşturulduğunda yakalanan sütunlar olarak tanımlanan kaynak tablodaki sütunlardır. Yakalanan sütun listesinde sütun belirtilmediyse, kaynak tablodaki tüm sütunlar döndürülür.

Permissions

Sistem yöneticisi sabit sunucu rolünde veya sabit db_owner veritabanı rolünde üyelik gerektirir. Diğer tüm kullanıcılar için, kaynak tablodaki tüm yakalanan sütunlarda SELECT izni ve yakalama örneği için bir gating rolü tanımlanmışsa bu veritabanı rolüne üyelik gerektirir. Arayan kaynak veriyi görüntüleme iznine sahip olmadığında, fonksiyon tüm sütunlar için NULL değerlerin olduğu bir satır döndürür.

Remarks

Bir satırın fn_cdc_get_net_changes benzersiz tanımlayıcısında yapılan değişiklikler, ilk UPDATE komutun ardından bir DELETEINSERT komutla gösterilmesine neden olur. Bu davranış, anahtarı hem değişimden önce hem de sonra takip etmek için gereklidir.

Eğer çağrı sırasında sağlanan LSN aralığı uygun cdc.fn_cdc_get_all_changes_<capture_instance> değilse cdc.fn_cdc_get_net_changes_<capture_instance>veya 313 hatası beklenmektedir. Parametre lsn_value en düşük LSN veya en yüksek LSN zamanının ötesindeyse, bu fonksiyonların çalıştırılması hatayla 313 döner: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function. Bu hata geliştirici tarafından işlenmelidir.

Examples

Aşağıdaki örnek, belirli bir zaman aralığında kaynak tabloya HumanResources.Department yapılan net değişiklikleri raporlamak için fonksiyonu cdc.fn_cdc_get_net_changes_HR_Department kullanır.

İlk olarak, GETDATE fonksiyon zaman aralığının başlangıcını işaretlemek için kullanılır. Kaynak tabloya birkaç DML ifadesi uygulandıktan sonra, zaman aralığının sonunu belirlemek için GETDATE fonksiyon tekrar çağrılır. sys.fn_cdc_map_time_to_lsn fonksiyonu, zaman aralığını LSN değerleriyle sınırlanmış bir değişiklik veri yakalama sorgu aralığına eşlemek için kullanılır. Son olarak, fonksiyon cdc.fn_cdc_get_net_changes_HR_Department zaman aralığı için kaynak tablosundaki net değişiklikleri elde etmek için sorgulanır. Eklenen ve sonra silinen satırın, fonksiyon tarafından döndürülen sonuç kümesinde görünmediğine dikkat edin. Bunun nedeni, sorgu penceresinde önce eklenip sonra silinen bir satırın aralık için kaynak tabloda net değişiklik yaratmamasıdır.

Note

Bu örneği çalıştırmadan önce, tabloda CDC'yi HumanResources.Departmentetkinleştirmek için önce sys.sp_cdc_enable_table (Transact-SQL) içinde örnek B'yi çalıştırmalısınız. Aşağıdaki örnekte, HR_Department CDC yakalama örneğinin adıdır; bu adında belirtildiği sys.sp_cdc_enable_tablegibi.

USE AdventureWorks2022;  
GO  
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);  
-- Obtain the beginning of the time interval.  
SET @begin_time = DATEADD(day, -1, GETDATE()) ;  
-- DML statements to produce changes in the HumanResources.Department table.  
INSERT INTO HumanResources.Department (Name, GroupName)  
VALUES (N'MyDept', N'MyNewGroup');  
  
UPDATE HumanResources.Department  
SET GroupName = N'Resource Control'  
WHERE GroupName = N'Inventory Management';  
  
DELETE FROM HumanResources.Department  
WHERE Name = N'MyDept';  
  
-- Obtain the end of the time interval.  
SET @end_time = GETDATE();  
-- Map the time interval to a change data capture query range.  
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);  
SET @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);  
  
-- Return the net changes occurring within the query window.  
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');  

Ayrıca Bkz.