Udostępnij za pośrednictwem


Jak zmienić śledzenia zmian dojścia do bazy danych

Niektóre aplikacje używające śledzenia zmian wykonywania dwukierunkowej synchronizacji z innego magazynu danych.Oznacza to, że zmiany wprowadzone w SQL Server bazy danych są aktualizowane w magazynie danych, a zmiany wprowadzone w magazynie inne są aktualizowane w SQL Server bazy danych.

Gdy aplikacja aktualizuje lokalnej bazy danych zmiany z innego magazynu danych, aplikacja musi wykonać następujące operacje:

  • Sprawdzić konflikty.

    Konflikt występuje po zmianie tych samych danych w tym samym czas w obu magazynów danych.Aplikacja musi być w stanie sprawdzić konflikt i uzyskania wystarczających informacji, aby włączyć konfliktu jest rozpoznawana.

  • Przechowywanie informacji w kontekście aplikacji.

    Aplikacja przechowuje dane z informacji śledzenia zmian.Informacja ta będzie dostępna wraz z innych zmian informacji podczas zmiany zostały uzyskane z lokalnej bazy danych.Typowy przykład to informacji kontekstowych jest identyfikatorem magazynu danych, który był źródło zmiany.

Do wykonywania poprzedniej operacji, aplikacja synchronizacji można używać następujących funkcji:

  • CHANGETABLE(VERSION…)

    Po wprowadzeniu zmian aplikacji go sprawdzić konflikty za pomocą tej funkcja.Funkcja uzyskuje najnowszych informacji dla określonego wiersza w tabela prześledzone zmiany śledzenia zmian.Śledzenie zmian zawiera wersja wiersz, który był ostatnio zmieniany.Informacja ta umożliwia aplikacji ustalić, czy wiersz został zmieniony po ostatnim czas zsynchronizowane aplikacji.

  • Z CHANGE_TRACKING_CONTEXT

    Aplikację można używać do przechowywania danych w kontekście niniejszej klauzula.

Sprawdzania konfliktów

W scenariuszu synchronizacja dwukierunkowa aplikacji klient należy ustalić, czy wiersz nie została zaktualizowana od aplikacji ostatnio uzyskane zmiany.

Poniższy przykład pokazuje sposób użycia funkcja CHANGETABLE(VERSION …), aby sprawdzić konflikty w sposób najbardziej efektywny, bez odrębnej kwerendy.In the example, CHANGETABLE(VERSION …) determines the SYS_CHANGE_VERSION for the row specified by @product id.CHANGETABLE(CHANGES …) can obtain the same information, but that would be less efficient.Jeśli wartość SYS_CHANGE_VERSION wiersza jest większy niż wartość @last_sync_version, istnieje konflikt.Jeśli występuje konflikt, wiersz nie zostaną zaktualizowane.ISNULL() Wyboru jest wymagane, ponieważ może to być nie Zmień informacje dostępne dla wiersza.Brak informacji o zmianie czy istnieje wiersz nie miał zaktualizowane od czasu włączenia śledzenia zmian lub ponieważ został oczyszczony Zmień informacje.

-- Assumption: @last_sync_version has been validated.

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)

Poniższy kod można sprawdzić Liczba zaktualizowanych wierszy i można określić więcej informacji na temat konfliktu.

-- If the change cannot be made, find out more information.
IF (@@ROWCOUNT = 0)
BEGIN
    -- Obtain the complete change information for the row.
    SELECT
        CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_CREATION_VERSION,
        CT.SYS_CHANGE_OPERATION, CT.SYS_CHANGE_COLUMNS
    FROM
        CHANGETABLE(CHANGES SalesLT.Product, @last_sync_version) AS CT
    WHERE
        CT.ProductID = @product_id;

    -- Check CT.SYS_CHANGE_VERSION to verify that it really was a conflict.
    -- Check CT.SYS_CHANGE_OPERATION to determine the type of conflict:
    -- update-update or update-delete.
    -- The row that is specified by @product_id might no longer exist 
    -- if it has been deleted.
END

Ustawianie informacji kontekstu

Za pomocą klauzula Z CHANGE_TRACKING_CONTEXT, aplikacja może przechowywać informacje kontekstu wraz z Zmień informacje.Te informacje można następnie uzyskać z SYS_CHANGE_CONTEXT kolumna, który jest zwracany przez CHANGETABLE(CHANGES …).

Informacje kontekstu jest zazwyczaj używane do identyfikowania źródło zmiany.Jeżeli można zidentyfikować źródło zmiany, informacje można przez Magazyn danych w celu uniknięcia uzyskania zmiany podczas synchronizuje je ponownie.

  -- Try to update the row and check for a conflict.
  WITH CHANGE_TRACKING_CONTEXT (@source_id)
  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)

Zapewnienie spójnego i poprawne wyniki

Aplikacji należy uwzględnić w procesie oczyszczania sprawdza, wartość @ last_sync_version.Jest tak, ponieważ danych mogła zostać usunięta po CHANGE_TRACKING_MIN_VALID_VERSION() została wywołana, ale przed aktualizacji.

Ważna informacjaWażne:

Zaleca się używać migawka izolacji i wprowadzić zmiany w obrębie transakcji migawka.

-- Prerequisite is to ensure ALLOW_SNAPSHOT_ISOLATION is ON for the database.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
    -- Verify that last_sync_version is valid.
    IF (@last_sync_version <
CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(‘SalesLT.Product’)))
    BEGIN
       RAISERROR (N’Last_sync_version too old’, 16, -1);
    END
    ELSE
    BEGIN
        -- Try to update the row.
        -- Check @@ROWCOUNT and check for a conflict.
    END
COMMIT TRAN

Ostrzeżenie

Istnieje możliwość, że wiersz aktualizowany w obrębie transakcji migawka może zostały zaktualizowane w inna transakcja po transakcji migawka została uruchomiona.W takim przypadek konflikt aktualizacji izolacji migawka wystąpić i prowadzić do transakcji, zostanie rozwiązana.Jeśli tak się stanie, próbę aktualizacji.Następnie doprowadzi do zmian wykrycia konfliktów i wiersze nie są zmieniane.