CHANGETABLE (Transact-SQL)

Возвращает информацию отслеживания изменений для таблицы. Можно использовать эту инструкцию для возврата всех изменений таблицы или информации отслеживания изменений для конкретной строки.

Значок ссылки на разделСоглашение о синтаксисе Transact-SQL

Синтаксис

CHANGETABLE (
        { CHANGES table , last_sync_version
        | VERSION table , <primary_key_values> } )
[AS] table_alias [ ( column_alias [ ,...n ] )

<primary_key_values> ::=
( column_name [ , ...n ] ) , ( value [ , ...n ] )

Аргументы

  • CHANGES table , last_sync_version
    Возвращает данные отслеживания изменений для всех изменений в таблице, произведенных после версии, указанной параметром last_sync_version.

    • table
      Пользовательская таблица, в которой регистрируются отслеживаемые изменения. Отслеживание изменений необходимо включить в таблице. Может использоваться имя таблицы, состоящее из одной, двух, трех или четырех частей. Имя таблицы может быть синонимом таблицы.

    • last_sync_version
      При получении изменений вызывающее приложение должно указать точку, с которой необходимы эти изменения. Значение last_sync_version указывает эту точку. Функция возвращает данные обо всех строках, изменившихся начиная с этой версии. Приложение запрашивает изменения с версией, большей, чем значение last_sync_version.

      Как правило, прежде чем получить изменения, в приложении вызывается функция CHANGE_TRACKING_CURRENT_VERSION(), чтобы получить версию, которая будет использоваться в следующий раз, когда потребуются изменения. Поэтому в приложении нет необходимости интерпретировать или разбирать фактическое значение.

      Поскольку значение last_sync_version получается в вызывающем приложении, именно приложение должно хранить указанное значение. Если это значение в приложении будет утеряно, потребуется повторная инициализация данных.

      .

      Аргумент last_sync_version имеет тип bigint. Это значение должно быть скалярным. Использование выражения приведет к возникновению синтаксической ошибки.

      При значении NULL возвращаются все отслеживаемые изменения.

      Версию last_sync_version необходимо проверить и убедиться в том, что она не устарела, поскольку некоторые или все данные изменений могут быть очищены в соответствии со значением срока хранения, настроенным для базы данных. Дополнительные сведения см. в разделах CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) и Параметры ALTER DATABASE SET (Transact-SQL).

  • VERSION table, { <primary_key_values> }
    Возвращает информацию о последнем изменении указанной строки. Значения первичного ключа должны идентифицировать строку. <primary_key_values> определяет столбцы первичного ключа и указывает значения. Имена столбцов первичного ключа могут быть указаны в любом порядке.

    • Table
      Пользовательская таблица для получения информации отслеживания изменений. Отслеживание изменений необходимо включить в таблице. Может использоваться имя таблицы, состоящее из одной, двух, трех или четырех частей. Имя таблицы может быть синонимом таблицы.

    • column_name
      Указывает одно или несколько имен столбцов первичного ключа. Несколько имен столбцов могут быть указаны в любом порядке.

    • Value
      Значение первичного ключа. Если существуют несколько столбцов первичного ключа, их значения должны быть указаны в том же порядке, в котором столбцы представлены в списке column_name.

  • [AS] table_alias [ (column_alias [ ,...n ] ) ]
    Задает имена для результатов, возвращаемых функцией CHANGETABLE.

    • table_alias
      Псевдоним таблицы, возвращаемый функцией CHANGETABLE. Аргумент table_alias является обязательным и должен быть допустимым идентификатором.

    • column_alias
      Необязательный псевдоним столбца или список псевдонимов столбцов, возвращаемых функцией CHANGETABLE. Обеспечивает возможность настройки имен столбцов в случае, если в результатах присутствуют повторяющиеся имена.

Возвращаемые типы

table

Возвращаемые значения

CHANGETABLE CHANGES

При указании ключевого слова CHANGES возвращается ноль или несколько строк, содержащих следующие столбцы.

Имя столбца

Тип данных

Описание

SYS_CHANGE_VERSION

bigint

Значение версии, связанное с последним изменением в строке

SYS_CHANGE_CREATION_VERSION

bigint

Значения версии, связанные с последней операцией вставки.

SYS_CHANGE_OPERATION

nchar(1)

Задает тип изменения:

U = обновление;

I = вставка;

D = удаление.

SYS_CHANGE_COLUMNS

varbinary(4100)

Содержит список столбцов, измененных после базовой версии.

ПримечаниеПримечание
Вычисляемые столбцы никогда не включаются в список измененных столбцов.

Принимает значение NULL, если выполняется любое из следующих условий.

  • Отслеживание изменений столбцов не включено.

  • Операция представляет собой операцию вставки или удаления.

  • Столбцы всех ключей, не являющихся первичными, были обновлены одной операцией. Это двоичное значение не следует интерпретировать непосредственно. Для его интерпретации используйте функцию CHANGE_TRACKING_IS_COLUMN_IN_MASK().

SYS_CHANGE_CONTEXT

varbinary(128)

Измените контекст, который указывается дополнительно с использованием предложения WITH как часть инструкции INSERT, UPDATE или DELETE.

<значение столбца первичного ключа>

Такие же, как столбцы таблицы пользователя

Значения первичного ключа для отслеживаемой таблицы. Эти значения уникально идентифицируют каждую строку в таблице пользователя.

CHANGETABLE VERSION

При указании значения VERSION возвращается одна строка, содержащая следующие столбцы.

Имя столбца

Тип данных

Описание

SYS_CHANGE_VERSION

bigint

Текущее значение версии изменений, связанное со строкой.

Принимает значение NULL, если изменение не производилось в течение периода времени, превышающего срок хранения данных отслеживания изменений, либо если строка не изменялась с момента включения отслеживания изменений.

SYS_CHANGE_CONTEXT

varbinary(128)

Измените контекст, который указывается дополнительно с использованием предложения WITH в качестве части запроса INSERT, UPDATE или DELETE.

<значение столбца первичного ключа>

Такие же, как столбцы таблицы пользователя

Значения первичного ключа для отслеживаемой таблицы. Эти значения уникально идентифицируют каждую строку в таблице пользователя.

Замечания

Функция CHANGETABLE обычно используется в предложении FROM запроса, как если бы она была таблицей.

CHANGETABLE(CHANGES...)

Чтобы получить данные для новых или измененных строк, соедините результирующий набор с пользовательской таблицей с помощью столбцов первичного ключа. Для каждой строки измененной пользовательской таблицы возвращается только одна строка, даже если с момента last_sync_version в одну и ту же строку было внесено несколько изменений.

Изменения столбца первичного ключа никогда не помечаются как обновления. Если значение первичного ключа изменяется, это изменение рассматривается как удаление прежнего значения и вставка нового.

Если удалить, а затем вставить строку, содержащую тот же первичный ключ, такое изменение рассматривается как обновление для всех столбцов в строке.

Значения, возвращаемые для столбцов SYS_CHANGE_OPERATION и SYS_CHANGE_COLUMNS, являются относительными к заданной базовой версии. Например, если операция вставки была выполнена в версии 10, операция обновления — в версии 15, а базовой версией является last_sync_version 12, регистрируется обновление. Если значение last_sync_version равно 8, регистрируется вставка. Изменения в вычисляемых столбцах никогда не регистрируются в столбце SYS_CHANGE_COLUMNS как обновления.

В целом в пользовательских таблицах отслеживаются все операции вставки, обновления и удаления данных, включая инструкцию MERGE.

Не отслеживаются следующие операции, затрагивающие данные в пользовательских таблицах.

  • Выполнение инструкции UPDATETEXT

    Эта инструкция устарела и в следующей версии SQL Server будет удалена. Однако изменения, произведенные с помощью предложения .WRITE инструкции UPDATE, отслеживаются.

  • Удаление строк с помощью инструкции TRUNCATE TABLE

    При усечении таблицы данные отслеживания изменений, связанные с таблицей, будут сброшены, как будто отслеживание изменений для таблицы только что включено. Клиентское приложение должно обязательно произвести синхронизацию версий. Проверка окончится неуспешно, если таблица была усечена.

CHANGETABLE(VERSION...)

Если указан несуществующий первичный ключ, возвращается пустой результирующий набор.

SYS_CHANGE_VERSION может иметь значение NULL, если никаких изменений не было внесено в течение периода, превышающего срок хранения (например, при очистке была удалена информация об изменениях), или если строка ни разу не изменялась с момента включения отслеживания изменений для таблицы.

Разрешения

Для получения данных отслеживания изменений необходимы следующие разрешения для таблицы, указанной значением table.

  • Разрешение SELECT на столбцы первичного ключа.

  • VIEW CHANGE TRACKING

Примеры

А. Возврат строк для исходной синхронизации данных

В следующем примере показано, как получить данные для исходной синхронизации данных таблицы. Запрос возвращает все данные строк и их связанные версии. Можно затем вставить или добавить эти данные в систему, где будут содержаться синхронизированные данные.

-- 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;

Б. Список всех изменений, внесенных после определенной версии

В следующем примере показано, как получить список всех изменений, внесенных в таблицу после указанной версии (@last_sync_version). [Emp ID] и SSN являются столбцами составного первичного ключа.

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;

В. Получение всех измененных данных для синхронизации

В следующем примере показано, как можно получить все измененные данные. Этим запросом данные отслеживания изменений объединяются с пользовательской таблицей таким образом, чтобы был выполнен возврат данных пользовательской таблицы. Ключевое слово LEFT OUTER JOIN используется для возврата строки для удаленных строк.

-- 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;

Г. Выявление конфликтов с помощью инструкции CHANGETABLE(VERSION...)

В следующем примере показано, как выполнить обновление строки только в случае, если строка не изменялась после последней синхронизации. Номер версии конкретной строки можно получить с помощью функции CHANGETABLE. Если строка была обновлена, изменения не вносятся и запрос возвращает данные о самом последнем изменении, внесенном в строку.

-- @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);