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) |
Содержит список столбцов, измененных после last_sync_version (базовой версии).
Принимает значение NULL, если выполняется любое из следующих условий.
|
||
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, являются относительными к заданной базовой версии (last_sync_version). Например, если операция вставки была выполнена в версии 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);
См. также
Справочник
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)