Uzyskiwanie zmiany przy użyciu funkcji śledzenia zmian
W tym temacie opisano zmiany w funkcji śledzenia SQL Server 2008 i sposób ich użycia do uzyskania zmiany dokonane w bazie danych i informacji dotyczących zmian.
Informacje dotyczące funkcji śledzenia zmian
Aplikacje mogą używać następujących funkcji uzyskiwania zmiany dokonane w bazie danych i informacji na temat zmiany:
Funkcja CHANGETABLE (… zmian)
Ta funkcja zestawu zestaw wierszy jest używana do kwerendy, zmiana informacji.Funkcja wykonuje kwerendę dotyczącą danych przechowywanych w wewnętrznych zmian tabel.Funkcja zwraca zestaw wyniki, który zawiera klucze podstawowe wierszy, które zmieniły się wraz z innymi informacjami zmiany, takich jak działania, zaktualizowane kolumn i wersja wiersza.CHANGETABLE(CHANGES …) trwa ostatniej wersja synchronizacji jako argumentu.Semantyka ostatniej wersja synchronizacji są następujące:
Wywołanie klient uzyskał zmian i informacje o wszystkich zmian, łącznie z ostatniej wersja synchronizacji.
W związku z tym CHANGETABLE(CHANGES …) zwraca wszystkie zmiany, które miały miejsce po ostatniej wersja synchronizacji.
Na następującej ilustracji pokazano, w jaki sposób CHANGETABLE(CHANGES …) jest używany do uzyskiwania zmian.
.gif)
Funkcja CHANGE_TRACKING_CURRENT_VERSION()
Służy do uzyskiwania bieżącej wersja, która będzie używana przy następnym czas podczas badania zmian.Ta wersja stanowi wersję zaangażowana w ostatniej transakcji.Funkcja () CHANGE_TRACKING_MIN_VALID_VERSION
Służy do uzyskiwania minimalna wersja ważne, że klient ma i nadal uzyskać prawidłowe wyniki z CHANGETABLE().Klient powinien sprawdzić ostatniej wersja synchronizacji przed thatis wartość zwracana przez tę funkcja.Jeśli ostatnia wersja synchronizacji jest mniejsza niż wersja zwrócone przez tę funkcja, klient nie będzie mógł uzyskać prawidłowe wyniki z CHANGETABLE() i będzie musiał ponownie zainicjować.
Uzyskiwanie danych początkowego.
Zanim aplikacja może uzyskać zmian w pierwszym czas, aplikacja musi wysłać kwerendę w celu uzyskania danych początkowych i wersja synchronizacji.Aplikacja musi uzyskać odpowiednie dane bezpośrednio z tabela, a następnie użyj CHANGE_TRACKING_CURRENT_VERSION() uzyskać wersja początkowej.Ta wersja zostanie przekazany do CHANGETABLE(CHANGES …) zmiany uzyskuje się po raz pierwszy.
W poniższym przykładzie pokazano, jak uzyskać wersja wstępna synchronizacja i początkowego zestaw danych.
-- Obtain the current synchronization version. This will be used next time that changes are obtained.
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();
-- Obtain initial data set.
SELECT
P.ProductID, P.Name, P.ListPrice
FROM
SalesLT.Product AS P
Uzyskaj zmiany przy użyciu funkcji śledzenia zmian
Aby uzyskać zmienionych wierszy tabela oraz informacje na temat zmiany, należy użyć CHANGETABLE(CHANGES…).Na przykład, poniższa kwerenda uzyskuje zmian dla SalesLT.Product Tabela.
SELECT
CT.ProductID, CT.SYS_CHANGE_OPERATION,
CT.SYS_CHANGE_COLUMNS, CT.SYS_CHANGE_CONTEXT
FROM
CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
Zazwyczaj klient będzie chciał, aby uzyskać najnowsze dane dla wiersza, a nie tylko klucze podstawowe dla wiersza.W związku z tym aplikację będzie przyłączyć wyniki z CHANGETABLE(CHANGES …) z danymi w tabela użytkowników.Na przykład poniższa kwerenda łączy się z SalesLT.Product tabela, aby uzyskać wartości dla Name i ListPrice kolumny. Należy zwrócić uwagę na użycie OUTER JOIN. Jest to wymagane, aby upewnić się, że informacje zmiany są zwracane dla tych wierszy, które zostały usunięte z tabela użytkowników.
SELECT
CT.ProductID, P.Name, P.ListPrice,
CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
CT.SYS_CHANGE_CONTEXT
FROM
SalesLT.Product AS P
RIGHT OUTER JOIN
CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
P.ProductID = CT.ProductID
Aby uzyskać wersja do wykorzystania w następnej wyliczenia zmiany, należy użyć CHANGE_TRACKING_CURRENT_VERSION(), jak pokazano w poniższym przykładzie.
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION()
Jeśli aplikacja uzyskuje zmian, to muszą używać CHANGETABLE(CHANGES…) i CHANGE_TRACKING_CURRENT_VERSION(), jak pokazano w poniższym przykładzie.
-- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called.
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION();
-- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized.
SELECT
CT.ProductID, P.Name, P.ListPrice,
CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
CT.SYS_CHANGE_CONTEXT
FROM
SalesLT.Product AS P
RIGHT OUTER JOIN
CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
P.ProductID = CT.ProductID
Numery wersja
Bazy danych, który ma włączone rejestrowanie zmian ma licznika wersja, który zwiększa w tabelach śledzone zmiany zostaną wprowadzone zmiany.Każdy wiersz zmienionych ma numer wersja, który jest skojarzony z nim.Podczas wysyłania żądania do aplikacji w celu kwerendy w poszukiwaniu zmian, funkcja jest nazywana pobiera numer wersja.Funkcja ta zwraca informacje o wszystkich zmian dokonanych od tej wersja.Na kilka sposobów śledzenia wersja zmian przypomina pojęcia do rowversion Typ danych.
Sprawdzanie poprawności ostatnio synchronizowane wersja
Informacje o zmianach są obsługiwane przez określony czas.Limit czas jest określany na podstawie parametru CHANGE_RETENTION, który może być określony jako część instrukcji ALTER DATABASE.
Weź pod uwagę czas określony dla CHANGE_RETENTION Określa, jak często wszystkich aplikacji musi zażądać zmian w bazie danych.Jeśli aplikacja ma wartość w polu last_synchronization_version to jest starsza niż wersja minimalna synchronizacji prawidłowy dla tabela, że aplikacja nie może wykonać ważne zmiany wyliczenia. Dzieje się tak, ponieważ może być niektóre informacje zmiany zostały oczyszczone.Zanim aplikacja uzyskuje zmian za pomocą CHANGETABLE(CHANGES …), aplikacja musi sprawdzić poprawność wartości dla last_synchronization_version czy planuje przekazać CHANGETABLE (… zmian). Jeśli wartość last_synchronization_version nie jest prawidłowy, że aplikacja musi ponownie zainicjować wszystkich danych.
W poniższym przykładzie pokazano, jak sprawdzić ważność wartości last_synchronization_version dla każdej tabela.
-- Check individual table.
IF (@last_synchronization_version < CHANGE_TRACKING_MIN_VALID_VERSION(
OBJECT_ID('SalesLT.Product')))
BEGIN
-- Handle invalid version and do not enumerate changes.
-- Client must be reinitialized.
END
Jak to pokazano w następującym przykładzie, ważność wartości last_synchronization_version może być sprawdzany na podstawie wszystkich tabel w bazie danych.
-- Check all tables with change tracking enabled
IF EXISTS (
SELECT COUNT(*) FROM sys.change_tracking_tables
WHERE min_valid_version > @last_synchronization_version )
BEGIN
-- Handle invalid version & do not enumerate changes
-- Client must be reinitialized
END
Za pomocą kolumna śledzenia
kolumna śledzenia pozwala aplikacjom uzyskać danych dla kolumn, które uległy zmianie zamiast całego wiersza.Na przykład Rozważmy scenariusz, w którym znajduje się jeden lub kilka kolumn, które są duże, ale rzadko zmian; i ma także inne kolumny, które często zmieniają się w tabela.Bez śledzenia kolumna aplikacji tylko może ustalić, że wiersz został zmieniony i do synchronizowania wszystkich danych zawiera duży kolumna danych.Jednak przy użyciu kolumna śledzenia, aplikacja może ustalić, czy danych kolumna duże zmiany i tylko synchronizacji danych, jeżeli została ona zmieniona.
Śledzenie informacji o kolumnie jest wyświetlany kolumna SYS_CHANGE_COLUMNS zwracaną przez funkcja CHANGETABLE(CHANGES …).
kolumna śledzenia można używać w taki sposób, że zwracana jest wartość NULL dla kolumna, które nie uległy zmianie.Jeśli kolumna może być zmieniany na wartość NULL, oddzielnych kolumnach muszą zostać zwrócone w celu wskazania, czy w kolumnie zmieniony.
W poniższym przykładzie CT_ThumbnailPhoto kolumna będzie NULL Jeśli kolumna nie został zmieniony. Ta kolumna może być również NULL ponieważ został zmieniony na NULL -Aplikacja może używać CT_ThumbNailPhoto_Changed Kolumna, do ustalenia, czy w kolumnie zmieniony.
DECLARE @PhotoColumnId int = COLUMNPROPERTY(
OBJECT_ID('SalesLT.Product'),'ThumbNailPhoto', 'ColumnId')
SELECT
CT.ProductID, P.Name, P.ListPrice, -- Always obtain values.
CASE
WHEN CHANGE_TRACKING_IS_COLUMN_IN_MASK(
@PhotoColumnId, CT.SYS_CHANGE_COLUMNS) = 1
THEN ThumbNailPhoto
ELSE NULL
END AS CT_ThumbNailPhoto,
CHANGE_TRACKING_IS_COLUMN_IN_MASK(
@PhotoColumnId, CT.SYS_CHANGE_COLUMNS) AS
CT_ThumbNailPhoto_Changed
CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS,
CT.SYS_CHANGE_CONTEXT
FROM
SalesLT.Product AS P
INNER JOIN
CHANGETABLE(CHANGES SalesLT.Product, @last_synchronization_version) AS CT
ON
P.ProductID = CT.ProductID AND
CT.SYS_CHANGE_OPERATION = 'U'
Uzyskiwanie wyniki spójny i popraw
Uzyskiwanie zmienionych danych dla tabela wymaga wielu kroków.Należy pamiętać, że niespójne lub nieprawidłowe wyniki można zwracaną, jeśli pewne problemy nie są uważane za i obsługiwane.
Na przykład uzyskanie zmiany, które zostały wprowadzone do tabela Sprzedaż i tabela SalesOrders aplikacji czy wykonaj następujące czynności:
Sprawdź poprawność ostatniej wersja zsynchronizowane przy użyciu CHANGE_TRACKING_MIN_VALID_VERSION().
Uzyskanie wersja, które mogą być używane do uzyskania zmienić następną czas przy użyciu CHANGE_TRACKING_CURRENT_VERSION().
Zmiany w tabela Sprzedaż można uzyskać, korzystając z CHANGETABLE(CHANGES …).
Zmiany w tabela SalesOrders można uzyskać, korzystając z CHANGETABLE(CHANGES …).
Występują dwa procesy w bazie danych, które mogą mieć wpływ na wyniki, które są zwracane przez poprzednie kroki:
Proces oczyszczania jest uruchamiany w tle i usuwa zmienić informacje o śledzeniu, która jest starsza niż okres zachowywania określony.
Proces oczyszczania jest procesem osobne tło, który używa okres zachowywania, określone podczas konfigurowania zmian w bazie danych.Problem jest, że proces oczyszczania, może wystąpić w czas między po ostatniej wersja synchronizacji został sprawdzony i utworzenia wywołanie CHANGETABLE(CHANGES…).Ostatniej wersja synchronizacji, która znajdowała się tylko ważne może nie być już prawidłowe przez czas uzyskuje się zmiany.W związku z tym niepoprawne wyniki mogą być zwracane.
Bieżące operacje DML występujących w tabelach sprzedaży i SalesOrders, takie jak następujące operacje:
Można wprowadzać zmian do tabel, po wersji dla następnego czas uzyskano za pomocą CHANGE_TRACKING_CURRENT_VERSION().W związku z tym mogą być zwracane zmiany więcej, niż oczekiwano.
Transakcja może przekazać w czasie między wywołaniu w celu uzyskania zmian z tabela Sprzedaż i wywołaniu w celu uzyskania zmian z tabela SalesOrders.Wyniki w tabela Zamówienie sprzedaży może więc obcego wartości klucz, który nie tabela Sprzedaż.
Aby wyeliminować wymienione wcześniej wyzwań, firma Microsoft zaleca, aby używać izolacji migawka.Pomoże to zapewnić spójność informacji o zmianie i uniknąć wyścigu powiązanych zadań oczyszczania tła.Jeśli migawka transakcje nie są używane, tworzenia aplikacji, która używa do śledzenia zmian może wymagać znacznie więcej wysiłku.
Za pomocą migawek izolacji
Śledzenie zmian został zaprojektowany do pracy z izolacji migawka.migawka izolacji musi być włączona dla bazy danych.Wszystkie kroki, które są wymagane do uzyskania zmiany musi znajdować się wewnątrz transakcji migawka.Daje to pewność, że wszystkich zmian wprowadzonych do danych podczas uzyskiwania zmiany nie będzie widoczny na zapytania wewnątrz transakcji migawka.
W celu uzyskania danych wewnątrz transakcji migawka, wykonaj następujące czynności:
Ustaw poziom izolacji transakcji do migawka i uruchomić transakcję.
Sprawdzanie poprawności ostatniej wersja synchronizacji za pomocą CHANGE_TRACKING_MIN_VALID_VERSION().
Uzyskanie wersja jest używane przy następnym czas przy użyciu CHANGE_TRACKING_CURRENT_VERSION().
Uzyskać zmian w tabela sprzedaż przy użyciu CHANGETABLE(CHANGES …)
Uzyskać zmian w tabela Salesorders przy użyciu CHANGETABLE(CHANGES …)
zatwierdzanie transakcji.
Należy pamiętać, jak wszystkie kroki w celu uzyskania zmian na kilka kwestii znajdują się w transakcji migawka:
Jeśli oczyszczanie nastąpi po uwierzytelnieniu ostatniej wersja synchronizacji, jak operacji usuwania, wykonywane przez oczyszczania nie będą widoczne w transakcji wyniki z CHANGETABLE(CHANGES …) nadal będzie obowiązywał.
Wszelkie zmiany wprowadzone do tabela Sprzedaż lub z tabela SalesOrders po uzyskaniu następnej wersja synchronizacja nie będzie widoczny, a wywołania CHANGETABLE(CHANGES …) nigdy nie będzie zwracać zmian w wersja nowszej niż zwrócony przez CHANGE_TRACKING_CURRENT_VERSION().Spójność między tabelą sprzedaży i tabelą SalesOrders będą również przechowywane, ponieważ transakcje, które zostały zatwierdzone w czas między wywołaniami CHANGETABLE (… zmian) nie będą widoczne.
W poniższym przykładzie pokazano, jak migawka izolacji jest włączone dla bazy danych.
-- The database must be configured to enable snapshot isolation.
ALTER DATABASE AdventureWorksLT
SET ALLOW_SNAPSHOT_ISOLATION ON;
Transakcja migawka jest używane w następujący sposób:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
-- Verify that version of the previous synchronization is valid.
-- Obtain the version to use next time.
-- Obtain changes.
COMMIT TRAN
Aby uzyskać więcej informacji o transakcjach migawka zobacz Za pomocą wiersza oparte na wersji poziomy izolacji.
Rozwiązania alternatywne w stosunku do za pomocą migawek izolacji
Dostępne są rozwiązania alternatywne w stosunku do przy użyciu izolacji migawka, ale wymagają więcej pracy, aby upewnić się, że są spełnione wszystkie wymagania aplikacji.Aby upewnić się, że last_synchronization_version jest prawidłowa i dane nie są usuwane w procesie oczyszczania, zanim uzyska się zmian, wykonaj następujące czynności:
Sprawdź last_synchronization_version Po wywołań CHANGETABLE().
Sprawdź last_synchronization_version w ramach każdej kwerendy w celu uzyskania zmian za pomocą CHANGETABLE().
Zmiany może wystąpić po otrzymaniu wersja synchronizacji dla następnego wyliczenia.Istnieją dwa sposoby obsługi tej sytuacji.Tę opcję, która jest używana, zależy od aplikacji i w jaki sposób może obsłużyć efekty uboczne każde podejście:
Ignoruj zmiany, które mają większy od nowa wersja synchronizację wersji.
To podejście jest efektem ubocznym, które są nowe lub zaktualizowane wiersza pominięte, jeżeli go został utworzony lub zaktualizowany zanim nowa wersja synchronizacji, ale następnie zaktualizować później.W przypadku nowego wiersza, problem integralność referencyjnej może wystąpić, jeśli było wiersza w innej tabela, która została utworzona, do którego odwołuje się pominięto wiersza.W przypadku istniejącego wiersza zaktualizowane, wiersz zostanie pominięty i nie zsynchronizowane dopiero wtedy, gdy.
Zawiera wszystkie zmiany, nawet tych, które znajdują się wersje większy od nowa wersja synchronizacji.
Wiersze, które jest większe niż nowa wersja synchronizacji wersja zostanie uzyskana ponownie podczas następnej synchronizacji.Musi to być oczekiwano i obsługiwane przez aplikację.
Oprócz poprzednich dwóch opcji można opracować podejścia, która jest połączeniem obu opcji, w zależności od operacji.Na przykład można aplikację, dla których najlepiej zignorować zmiany nowsze niż w następnej wersja synchronizacji, w której wiersz został utworzony lub usunięty, ale aktualizacje nie są ignorowane.
Uwaga
Wybieranie metody, która będzie działać w przypadku aplikacji przy użyciu programu śledzenia zmian (lub mechanizmu niestandardowe śledzenia), wymaga znaczących analizy.Dlatego jest znacznie prostsze używać izolacji migawka.