Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Zwraca informacje o śledzeniu zmian dla tabeli. Możesz użyć tego zdania do zwracania wszystkich zmian dla tabeli lub informacji o śledzeniu zmian dla konkretnego wiersza.
Transact-SQL konwencje składni
Składnia
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
ZMIANY table_namelast_sync_version
Zwraca informacje śledzące dla wszystkich zmian w tabeli, które miały miejsce od wersji określonej przez last_sync_version.
table_name
To tabela zdefiniowana przez użytkownika, na której można uzyskać śledzone zmiany. Śledzenie zmian musi być włączone na tabeli. Można użyć jednoczęściowej, dwuczęściowej, trzy- lub czteroczęściowej nazwy tabeli. Nazwa tabeli może być synonimem tabeli.
last_sync_version
Wartość skalarna bigint do zerowania.
Wyrażenie powoduje błąd składniowy. Jeśli wartość jest NULL, zwracane są wszystkie śledzone zmiany.
Gdy aplikacja otrzymuje zmiany, musi określić punkt, od którego są wymagane zmiany.
last_sync_version to precyzuje. Funkcja zwraca informacje dla wszystkich wierszy, które zostały zmienione od tamtej wersji. Aplikacja zapytuje o zmiany o wersji większej niż last_sync_version.
Zazwyczaj, zanim aplikacja uzyska zmiany, wywołuje CHANGE_TRACKING_CURRENT_VERSION() wersję, która będzie używana przy kolejnych zmianach. Dlatego aplikacja nie musi interpretować ani rozumieć rzeczywistej wartości. Ponieważ last_sync_version jest uzyskiwane przez wywołującą aplikację, aplikacja musi zachować tę wartość. Jeśli aplikacja straci tę wartość, będzie musiała ponownie zainicjować dane.
last_sync_version powinny być weryfikowane, aby upewnić się, że nie są zbyt stare, ponieważ część lub wszystkie informacje o zmianach mogły zostać oczyszczone zgodnie z okresem przechowywania skonfigurowanym dla bazy danych. Więcej informacji można znaleźć w CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL ) oraz ALTER DATABASE SET Options (Transact-SQL).
WERSJA table_name, { primary_key_values }
Zwraca najnowsze informacje o śledzeniu zmian dla określonego wiersza. Wartości klucza podstawowego muszą identyfikować wiersz.
primary_key_values identyfikuje kolumny klucza głównego i określa wartości. Nazwy kolumn klucza głównego można określić w dowolnej kolejności.
table_name
To tabela zdefiniowana przez użytkownika, z której można uzyskać informacje o śledzeniu zmian. Śledzenie zmian musi być włączone na tabeli. Można użyć jednoczęściowej, dwuczęściowej, trzy- lub czteroczęściowej nazwy tabeli. Nazwa tabeli może być synonimem tabeli.
column_name
Określa nazwę kolumny lub kolumn klucza głównego. Wiele nazw kolumn można określić w dowolnej kolejności.
wartość
To wartość klucza głównego. Jeśli jest wiele głównych kolumn klucza, wartości muszą być określone w tej samej kolejności, w jakiej kolumny pojawiają się na liście column_name .
[ FORCESEEK ]
Dotyczy do: SQL Server (począwszy od SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 oraz SQL Server 2019 (15.x) CU11), Azure SQL Database oraz Azure SQL Managed Instance
Opcjonalny parametr wymuszający użycie operacji seek do uzyskania dostępu do table_name. W niektórych przypadkach, gdy zmieniło się bardzo niewiele wierszy, nadal można użyć operacji skanowania do dostępu do table_name. Jeśli operacja skanowania powoduje problem wydajności, użyj parametru FORCESEEK .
[AS] table_alias [ (column_alias [ ,... n ] ) ]
Zapewnia nazwy wyników zwracanych przez CHANGETABLE.
table_alias
To pseudonim tabeli zwracanej przez CHANGETABLE.
table_alias jest wymagany i musi być ważnym identyfikatorem.
column_alias
Jest opcjonalnym aliasem kolumn lub listą aliasów kolumn dla kolumn zwracanych przez CHANGETABLE. Pozwala to na dostosowanie nazw kolumn na wypadek, gdyby w wynikach pojawiły się zduplikowane nazwy.
Typy zwracane
table
Zwracane wartości
ZMIANY WYMIANY
Gdy określono CHANGES, zwracane są zera lub więcej wierszy zawierających następujące kolumny.
| Nazwa kolumny | Typ danych | Description |
|---|---|---|
| SYS_CHANGE_VERSION | bigint | Wartość wersji powiązana z ostatnią zmianą wiersza |
| SYS_CHANGE_CREATION_VERSION | bigint | Wartości wersji powiązane z ostatnią operacją wstawiania. |
| SYS_CHANGE_OPERATION | nchar(1) | Określa rodzaj zmiany: U = Aktualizacja I = Wstaw D = Usuń |
| SYS_CHANGE_COLUMNS | varbinary(4100) | Lista kolumn, które zmieniły się od last_sync_version (linii bazowej). Należy zauważyć, że kolumny obliczane nigdy nie są oznaczone jako zmienione. Wartość jest NULL, gdy spełniony jest dowolny z następujących warunków: Śledzenie zmian kolumn nie jest włączone. Operacja ta polega na wstawieniu lub usunięciu (insert or delete). Wszystkie kolumny klucza niepierwotnego zostały zaktualizowane w jednej operacji. Ta wartość binarna nie powinna być interpretowana bezpośrednio. Zamiast tego, do interpretacji, użyj CHANGE_TRACKING_IS_COLUMN_IN_MASK(). |
| SYS_CHANGE_CONTEXT | varbinary(128) | Zmień informacje kontekstowe, które możesz opcjonalnie określić, używając klauzuli WITH jako części instrukcji INSERT, UPDATE lub DETETE. |
| <Wartość kolumny klucza podstawowego> | Tak samo jak kolumny tabeli użytkownika | Główne wartości klucza dla tabeli śledzonej. Wartości te jednoznacznie identyfikują każdy wiersz w tabeli użytkownika. |
WERSJA ZMIENNA
Gdy określono VERSION, zwracany jest jeden wiersz zawierający następujące kolumny.
| Nazwa kolumny | Typ danych | Description |
|---|---|---|
| SYS_CHANGE_VERSION | bigint | Aktualna wartość zmień wersję, która jest powiązana z wierszem. Wartość ta jest NULL, jeśli zmiana nie została wprowadzona przez okres dłuższy niż okres przechowywania zmian, lub jeśli wiersz nie został zmieniony od czasu włączenia śledzenia zmian. |
| SYS_CHANGE_CONTEXT | varbinary(128) | Zmień informacje kontekstowe, które możesz opcjonalnie określić, używając klauzuli WITH jako części instrukcji INSERT, UPDATE lub DETETE. |
| <Wartość kolumny klucza podstawowego> | Tak samo jak kolumny tabeli użytkownika | Główne wartości klucza dla tabeli śledzonej. Wartości te jednoznacznie identyfikują każdy wiersz w tabeli użytkownika. |
Uwagi
Funkcja CHANGETABLE jest zazwyczaj używana w klauzuli FROM zapytania, jakby była to tabela.
CHANGETABLE(CHANGES...)
Aby uzyskać dane wierszowe dla nowych lub zmodyfikowanych wierszy, dołącz zestaw wyników do tabeli użytkownika za pomocą kolumn klucza głównego. Dla każdego wiersza w tabeli użytkownika, który został zmieniony, zwracany jest tylko jeden wiersz, nawet jeśli od czasu wartości last_sync_version nastąpiły wielokrotne zmiany w tym samym wierszu.
Zmiany w kolumnach klucza głównego nigdy nie są oznaczane jako aktualizacje. Jeśli wartość klucza podstawowego się zmienia, uznaje się to za usunięcie starej wartości i wstawienie nowej wartości.
Jeśli usuniesz wiersz, a następnie wstawisz wiersz z dawnym kluczem głównym, zmiana jest traktowana jako aktualizacja wszystkich kolumn w wierszu.
Wartości zwracane dla SYS_CHANGE_OPERATION kolumn i SYS_CHANGE_COLUMNS są względne względem określonej linii bazowej (last_sync_version). Na przykład, jeśli operacja wstawiania została wykonana w wersji 10 i operacja aktualizacji w wersji 15, a jeśli bazowa last_sync_version to 12, zostanie zgłoszona aktualizacja. Jeśli wartość last_sync_version to 8, zostanie zgłoszona wstawka.
SYS_CHANGE_COLUMNS nigdy nie zgłosi kolumn obliczeniowych jako zaktualizowanych.
Zazwyczaj śledzone są wszystkie operacje wstawiające, aktualizowane lub usuwające dane w tabelach użytkowników, w tym instrukcja MERGE.
Następujące operacje wpływające na dane tabel użytkownika nie są śledzone:
Wykonanie oświadczenia
UPDATETEXT. To oświadczenie jest wycofane i zostanie usunięte w przyszłej wersji SQL Server. Jednak zmiany wprowadzone za pomocą klauzuli.WRITEinstrukcji UPDATE są śledzone.Usuwanie wierszy za pomocą
TRUNCATE TABLE. Gdy tabela jest obcięta, informacje o wersji śledzenia zmian powiązane z tabelą są resetowane, jakby śledzenie zmian zostało właśnie włączone w tabeli. Aplikacja kliencka powinna zawsze weryfikować swoją ostatnią zsynchronizowaną wersję. Walidacja nie przestaje działać, jeśli tabela została obcięta.
CHANGETABLE (WERSJA...)
Pusty zbiór wyników jest zwracany, jeśli podano nieistniejący klucz główny.
Wartość może SYS_CHANGE_VERSION być NULL, jeśli zmiana nie została wprowadzona dłużej niż upływ okresu retencji (na przykład czyszczenie usunęło informacje o zmianie) lub wiersz nigdy nie został zmieniony od czasu włączenia śledzenia zmian dla tabeli.
Permissions
Wymaga SELECT uprawnień do kolumn klucza głównego oraz VIEW CHANGE TRACKING do tabeli określonej <przez wartość table_name> , aby uzyskać informacje o śledzeniu zmian.
Przykłady
A. Zwracanie wierszy do początkowej synchronizacji danych
Poniższy przykład pokazuje, jak uzyskać dane do początkowej synchronizacji danych tabelowych. Zapytanie zwraca wszystkie dane wierszowe oraz ich powiązane wersje. Następnie możesz wstawić lub dodać te dane do systemu, który będzie zawierał zsynchronizowane dane.
-- 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. Lista wszystkich zmian wprowadzonych od czasu konkretnej wersji
Poniższy przykład przedstawia wszystkie zmiany wprowadzone w tabeli od czasu określonej wersji (@last_sync_version). [Emp ID] i SSN to kolumny w złożonym kluczu podstawowym.
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. Uzyskanie wszystkich zmienionych danych do synchronizacji
Poniższy przykład pokazuje, jak można uzyskać wszystkie dane, które się zmieniły. To zapytanie łączy informacje o śledzeniu zmian z tabelą użytkownika, aby zwracać informacje o tablicy użytkownika. A LEFT OUTER JOIN jest używane, aby wiersz zwracany był dla usuniętych wierszy.
-- 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. Wykrywanie konfliktów za pomocą CHANGETABLE(VERSION...)
Poniższy przykład pokazuje, jak zaktualizować wiersz tylko wtedy, gdy nie zmienił się od ostatniej synchronizacji. Numer wersji konkretnego wiersza uzyskuje się, używając .CHANGETABLE Jeśli wiersz został zaktualizowany, zmiany nie są wprowadzane, a zapytanie zwraca informacje o najnowszej zmianie wiersza.
-- @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);
Zobacz też
Funkcje śledzenia zmian (Transact-SQL)
Śledzenie Zmian Danych (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)