Aracılığıyla paylaş


DEĞIŞIM TABLASI (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

İadeler, bir tablo için takip bilgilerini değiştirir. Bu ifadeyi bir tablo veya belirli bir satır için değişiklik takip bilgisi için tüm değişiklikleri döndürmek için kullanabilirsiniz.

Transact-SQL söz dizimi kuralları

Sözdizimi

CHANGETABLE (  
    { CHANGES <table_name> , <last_sync_version> 
    | VERSION <table_name> , <primary_key_values> } 
    , [ FORCESEEK ] 
    )  
[AS] <table_alias> [ ( <column_alias> [ ,...n ] )  
  
<primary_key_values> ::=  
( <column_name> [ , ...n ] ) , ( <value> [ , ...n ] )  

Arguments

DEĞIŞIKLIKLER table_name, last_sync_version
last_sync_version tarafından belirtilen sürümden bu yana bir tabloda gerçekleşen tüm değişiklikler için takip bilgilerini döndürür.

table_name
İzlenen değişikliklerin alınacağı kullanıcı tanımlı tablodur. Değişiklik takibi masada etkinleştirilmelidir. Bir, iki, üç veya dört bölümlü bir tablo adı kullanılabilir. Tablo adı, tablonun eşanlamlı bir özelliği olabilir.

last_sync_version
Nullable bigint skaler değeri. Bir ifade sözdizimi hatasına yol açar. Değer NULL ise, tüm takip edilen değişiklikler geri döner. Değişiklikler elde ettiğinde, çağrı uygulaması değişikliklerin hangi noktadan gerekli olduğunu belirtmelidir. last_sync_version o noktayı belirtir. Fonksiyon, o versiyondan sonra değiştirilen tüm satırlar için bilgi döndürür. Uygulama, last_sync_version'den büyük sürümde değişiklikleri almak için sorgu yapıyor. Genellikle, değişiklikler almadan önce, uygulama bir sonraki değişiklik gerektiğinde kullanılacak sürümü almak için çağrı CHANGE_TRACKING_CURRENT_VERSION() yapar. Bu nedenle, uygulama gerçek değeri yorumlamak veya anlamak zorunda değildir. last_sync_version çağıran uygulama tarafından elde edildiği için, uygulama bu değeri savurmak zorundadır. Uygulama bu değeri kaybederse, veriyi yeniden başlatması gerekir. last_sync_version çok eski olmadığından emin olmak için doğrulanmalıdır, çünkü veritabanı için yapılandırılan tutma süresine göre bazı veya tüm değişiklik bilgileri temizlenmiş olabilir. Daha fazla bilgi için CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) ve ALTER DATABASE SET Options (Transact-SQL) bölümlerine bakınız.

VERSION table_name, { primary_key_values }
Belirli bir satır için en son değişiklik takip bilgilerini döndürür. Birincil anahtar değerler satırı tanımlamalıdır. primary_key_values birincil anahtar sütunlarını tanımlar ve değerleri belirtir. Ana anahtar sütun adları herhangi bir sırayla belirtilebilir.

table_name
Değişiklik takip bilgisinin alınacağı kullanıcı tarafından tanımlanan tablodur. Değişiklik takibi masada etkinleştirilmelidir. Bir, iki, üç veya dört bölümlü bir tablo adı kullanılabilir. Tablo adı, tablonun eşanlamlı bir özelliği olabilir.

column_name
Ana anahtar sütun veya sütunların adını belirtir. Birden fazla sütun adı herhangi bir sırayla belirtilebilir.

value
Birincil anahtarın değeridir. Birden fazla ana anahtar sütunu varsa, değerler column_name listesinde sütunların göründüğü sırayla aynı sırayla belirtilmelidir.

[ FORCESEEK ]
Şunlar için geçerlidir: SQL Server (SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 ve SQL Server 2019 (15.x) CU11 ile başlayarak), Azure SQL Database ve Azure SQL Managed Instance

Arama işleminin kullanılmasını zorunlu kılan isteğe bağlı parametre table_name. Çok az satır değiştiğinde, tarama işlemi yine de table_name erişim için kullanılabilir. Eğer bu bir tarama işlemi performans sorunu yaratıyorsa, parametreyi FORCESEEK kullanın.

[AS] table_alias [ (column_alias [ ,... n ] ) ] ]
CHANGETABLE tarafından döndürülen sonuçlar için isimler sağlar.

table_alias
CHANGETABLE tarafından döndürülen tablonun takma adıdır. table_alias gereklidir ve geçerli bir tanımlayıcı olmalıdır.

column_alias
CHANGETABLE tarafından döndürülen sütunlar için isteğe bağlı bir sütun alias veya sütun alias listesidir. Bu, sonuçlarda tekrarlanan isimler varsa sütun isimlerinin özelleştirilmesini sağlar.

Dönüş Türleri

table

Dönüş Değerleri

DEĞIŞEBILIR DEĞIŞIKLIKLER

CHANGES belirtildiğinde, aşağıdaki sütunlara sahip sıfır veya daha fazla satır döner.

Sütun adı Veri türü Description
SYS_CHANGE_VERSION bigint Satırdaki son değişiklikle ilişkili sürüm değeri
SYS_CHANGE_CREATION_VERSION bigint Son ekleme işlemiyle ilişkili sürüm değerleri.
SYS_CHANGE_OPERATION nchar(1) Değişiklik türünü belirtir:

U = Güncelleme

I = Ekle

D = Sil
SYS_CHANGE_COLUMNS varbinary(4100) last_sync_version'dan bu yana değişen sütunları (baz) listeler. Hesaplanan sütunların asla değiştirilmiş olarak listelenmediğini unutmayın.

Aşağıdaki koşullardan herhangi biri doğruysa, değer NULL'dur:

Sütun değişim takibi etkin değil.

Bu işlem, bir ekleme veya silme işlemidir.

Tüm birincil olmayan anahtar sütunları tek bir işlemde güncellendi. Bu ikili değer doğrudan yorumlanmamalıdır. Bunun yerine, yorumlamak için CHANGE_TRACKING_IS_COLUMN_IN_MASK() kullanın.
SYS_CHANGE_CONTEXT varbinary(128) Bağlam bilgilerini INSERT, UPDATE veya DELETE ifadesinin parçası olarak WITH cümlesini kullanarak isteğe bağlı olarak belirleyebileceğiniz değişiklikleri yapabilirsiniz.
<birincil anahtar sütun değeri> Kullanıcı tablosu sütunlarıyla aynı İzlenen tablo için birincil anahtar değerler. Bu değerler, kullanıcı tablosundaki her satırı benzersiz şekilde tanımlar.

DEĞIŞTIRILEBILIR VERSIYON

VERSION belirtildiğinde, aşağıdaki sütunlara sahip bir satır döner.

Sütun adı Veri türü Description
SYS_CHANGE_VERSION bigint Satırla ilişkilendirilen mevcut değişiklik sürüm değeri.

Eğer değişiklik takip tutma süresinden daha uzun bir süre yapılmadıysa veya değişiklik takibi etkinleştirildiğinden beri satır değiştirilmediyse, değer NULL'dur.
SYS_CHANGE_CONTEXT varbinary(128) Bağlam bilgilerini INSERT, UPDATE veya DELETE ifadesinin parçası olarak WITH cümlesini kullanarak isteğe bağlı olarak belirleyebileceğiniz değişiklikleri yapabilirsiniz.
<birincil anahtar sütun değeri> Kullanıcı tablosu sütunlarıyla aynı İzlenen tablo için birincil anahtar değerler. Bu değerler, kullanıcı tablosundaki her satırı benzersiz şekilde tanımlar.

Açıklamalar

CHANGETABLE fonksiyonu genellikle bir sorgudaki FROM maddesinde bir tablo gibi kullanılır.

CHANGETABLE(CHANGES...)

Yeni veya değiştirilmiş satırlar için satır verisi elde etmek için, ana anahtar sütunlarını kullanarak sonuç kümesini kullanıcı tablosuna ekleyin. Kullanıcı tablosunda değiştirilen her satır için yalnızca bir satır döner; last_sync_version değerinden beri aynı satırda birden fazla değişiklik olmuş olsa bile.

Birincil anahtar sütun değişiklikleri asla güncelleme olarak işaretlenmez. Birincil anahtar değer değişirse, eski değerin silinmesi ve yeni değerin eklenmesi olarak kabul edilir.

Bir satırı siler ve eski ana anahtara sahip bir satır eklerseniz, bu değişiklik satırdaki tüm sütunlara güncelleme olarak görülür.

ve SYS_CHANGE_COLUMNS sütunları için döndürülen SYS_CHANGE_OPERATION değerler, belirtilen baz çizgisine (last_sync_version) görecelidir. Örneğin, bir ekleme 10 işlemi sürümünde yapılmışsa, 15güncelleme işlemi sürümünde yapılmışsa ve temel last_sync_version12ise bir güncelleme rapor edilir. Eğer last_sync_version değeri 8ise bir ekleme rapor edilir. SYS_CHANGE_COLUMNS hesaplanan sütunların güncellendiğini asla bildirmez.

Genellikle, kullanıcı tablolarına veri ekleme, güncelleme veya silme işlemleri, MERGE ifadesi dahil olmak üzere takip edilir.

Kullanıcı tablosu verilerini etkileyen aşağıdaki işlemler takip edilmez:

  • İfadeyi UPDATETEXT yürütüyor. Bu ifade kullanımdan kaldırılmıştır ve SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Ancak, UPDATE ifadesinin maddesi kullanılarak .WRITE yapılan değişiklikler takip edilir.

  • Satır silme ile TRUNCATE TABLE. Bir tablo kesildiğinde, tabloya bağlı değişiklik takip sürüm bilgisi, sanki değişiklik takibi yeni etkinleştirilmiş gibi sıfırlanır. Bir istemci uygulaması her zaman son senkronize edilmiş versiyonunu doğrulamalıdır. Doğrulama tablo kısaltıldıysa başarısız olur.

CHANGETABLE (VERSIYON...)

Var olmayan bir birincil anahtar belirtilirse boş bir sonuç kümesi döner.

SYS_CHANGE_VERSION Değeri, bir değişiklik tutma süresinden daha uzun süre yapılmadıysa (örneğin, temizleme değişiklik bilgisini kaldırdıysa) veya tablo için değişiklik takibi etkinleştirildiğinden beri satır hiç değiştirilmediyse NULL olabilir.

Permissions

Değişiklik takip bilgisi elde etmek için birincil anahtar sütunları ve VIEW CHANGE TRACKINGtable_name> değeriyle< belirtilen tablodaki izin gereklidirSELECT.

Örnekler

A. Verilerin ilk senkronizasyonu için satır döndürme

Aşağıdaki örnek, tablo verilerinin ilk senkronizasyonu için verilerin nasıl alınacağını gösterir. Sorgu, tüm satır verilerini ve ilgili sürümlerini döndürür. Sonra bu veriyi senkronize edilmiş verileri içeren sisteme ekleyebilir veya ekleyebilirsiniz.

-- Get all current rows with associated version  
SELECT e.[Emp ID], e.SSN, e.FirstName, e.LastName,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_CONTEXT  
FROM Employees AS e  
CROSS APPLY CHANGETABLE   
    (VERSION Employees, ([Emp ID], SSN), (e.[Emp ID], e.SSN)) AS c;  

B. Belirli bir sürümden sonra yapılan tüm değişiklikleri listelemek

Aşağıdaki örnek, belirtilen sürümden (@last_sync_version). [EMP ID] ve SSN, bileşik birincil anahtarda sütunlardır.

DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT [Emp ID], SSN,  
    SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION,  
    SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS C;  

C. Senkronizasyon için tüm değişen verilerin elde edilmesi

Aşağıdaki örnek, değişen tüm verileri nasıl elde edebileceğinizi gösterir. Bu sorgu, değişiklik takip bilgilerini kullanıcı tablosuyla birleştirerek kullanıcı tablosu bilgilerinin geri dönmesini sağlar. A LEFT OUTER JOIN kullanılır, böylece silinmiş satırlar için bir satır döner.

-- Get all changes (inserts, updates, deletes)  
DECLARE @last_sync_version bigint;  
SET @last_sync_version = <value obtained from query>;  
SELECT e.FirstName, e.LastName, c.[Emp ID], c.SSN,  
    c.SYS_CHANGE_VERSION, c.SYS_CHANGE_OPERATION,  
    c.SYS_CHANGE_COLUMNS, c.SYS_CHANGE_CONTEXT   
FROM CHANGETABLE (CHANGES Employees, @last_sync_version) AS c  
    LEFT OUTER JOIN Employees AS e  
        ON e.[Emp ID] = c.[Emp ID] AND e.SSN = c.SSN;  

D. CHANGETABLE(VERSİYON...) kullanılarak çatışmaları tespit etmek

Aşağıdaki örnek, satır son senkronizasyondan bu yana değişmemişse bir satırın nasıl güncelleneceğini gösterir. Belirli satırın sürüm numarası kullanılarak CHANGETABLEelde edilir. Satır güncellendiyse, değişiklik yapılmaz ve sorgu, satırdaki en son değişikliğe dair bilgi döndürür.

-- @last_sync_version must be set to a valid value  
UPDATE  
    SalesLT.Product  
SET  
    ListPrice = @new_listprice  
FROM  
    SalesLT.Product AS P  
WHERE  
    ProductID = @product_id AND  
    @last_sync_version >= ISNULL (  
        (SELECT CT.SYS_CHANGE_VERSION FROM   
            CHANGETABLE(VERSION SalesLT.Product,  
            (ProductID), (P.ProductID)) AS CT),  
        0);  

Ayrıca Bkz.

Değişiklik İzleme İşlevleri (Transact-SQL)
Veri Değişikliklerini İzleme (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (En az geçerli sürüm) (Transact-SQL)