Partilhar via


ALTERÁVEL (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

As devoluções alteram a informação de acompanhamento para uma tabela. Pode usar esta instrução para devolver todas as alterações de uma tabela ou informação de acompanhamento de alterações para uma linha específica.

Transact-SQL convenções de sintaxe

Sintaxe

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

ALTERAÇÕES table_name , last_sync_version
Retornos acompanham informações para todas as alterações a uma tabela que ocorreram desde a versão especificada por last_sync_version.

table_name
É a tabela definida pelo utilizador para obter alterações rastreadas. O acompanhamento de alterações deve estar ativado na mesa. Pode ser usado um nome de tabela de uma, duas, três ou quatro partes. O nome da tabela pode ser sinónimo da tabela.

last_sync_version
Um valor escalar bigint anulável. Uma expressão causará um erro de sintaxe. Se o valor for NULL, todas as alterações rastreadas são devolvidas. Quando obtém alterações, a aplicação que chama deve especificar o ponto a partir do qual as alterações são necessárias. A last_sync_version especifica esse ponto. A função devolve informação para todas as linhas que foram alteradas desde essa versão. A aplicação está a enviar consultas para receber alterações com uma versão superior a last_sync_version. Normalmente, antes de obter alterações, a aplicação liga CHANGE_TRACKING_CURRENT_VERSION() para obter a versão que será usada na próxima vez que forem necessárias alterações. Portanto, a aplicação não tem de interpretar ou compreender o valor real. Como last_sync_version é obtido pela aplicação que chama, a aplicação tem de persistir o valor. Se a aplicação perder esse valor, terá de reinicializar os dados. last_sync_version deve ser validado para garantir que não é demasiado antiga, pois parte ou toda a informação de alteração pode ter sido limpa de acordo com o período de retenção configurado para a base de dados. Para mais informações, veja CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) e ALTER DATABASE SET Options (Transact-SQL).

VERSÃO table_name, { primary_key_values }
Devolve a informação mais recente de acompanhamento de alterações para uma linha especificada. Os valores de chave primária devem identificar a linha. primary_key_values identifica as colunas principais e especifica os valores. Os nomes das colunas das chaves primárias podem ser especificados em qualquer ordem.

table_name
É a tabela definida pelo utilizador na qual obter informação de acompanhamento de alterações. O acompanhamento de alterações deve estar ativado na mesa. Pode ser usado um nome de tabela de uma, duas, três ou quatro partes. O nome da tabela pode ser sinónimo da tabela.

column_name
Especifica o nome da coluna ou colunas da chave primária. Vários nomes de colunas podem ser especificados em qualquer ordem.

value
É o valor da chave primária. Se existirem várias colunas de chave primária, os valores devem ser especificados pela mesma ordem em que as colunas aparecem na lista column_name .

[ FORÇAR BUSCA ]
Aplica-se a: SQL Server (A partir do SQL Server 2016 (13.x), SP2 CU16, SQL Server 2017 (14.x) CU24 e SQL Server 2019 (15.x) CU11), Azure SQL Database e Azure SQL Managed Instance

Parâmetro opcional que força a utilização de uma operação de procura para aceder à table_name. Em alguns casos em que muito poucas linhas mudaram, pode ainda ser usada uma operação de varrimento para aceder à table_name. Se uma operação de varrimento introduzir um problema de desempenho, use o FORCESEEK parâmetro.

[AS] table_alias [ (column_alias [ ,... n ] ) ]
Fornece nomes para os resultados que são devolvidos por CHANGETABLE.

table_alias
É o nome do alias da tabela que é devolvido por CHANGETABLE. table_alias é obrigatório e deve ser um identificador válido.

column_alias
É um alias de coluna opcional ou lista de aliases de coluna para as colunas que são devolvidas por CHANGETABLE. Isto permite personalizar os nomes das colunas caso haja nomes duplicados nos resultados.

Tipos de devolução

table

Valores de retorno

ALTERAÇÕES NO SISTEMA DE ALTERAÇÕES

Quando CHANGES é especificado, zero ou mais linhas com as colunas seguintes são retornadas.

Nome da coluna Tipo de dados Description
SYS_CHANGE_VERSION bigint Valor de versão associado à última alteração da linha
SYS_CHANGE_CREATION_VERSION bigint Valores de versão associados à última operação de inserção.
SYS_CHANGE_OPERATION Nchar(1) Especifica o tipo de alteração:

U = Atualização

I = Inserir

D = Eliminar
SYS_CHANGE_COLUMNS Varbinary(4100) Lista as colunas que mudaram desde o last_sync_version (a linha base). Note que as colunas calculadas nunca são listadas como alteradas.

O valor é NULL quando qualquer uma das seguintes condições é verdadeira:

O acompanhamento de alterações de coluna não está ativado.

A operação é uma operação de inserção ou eliminação.

Todas as colunas de chave não primárias foram atualizadas numa só operação. Este valor binário não deve ser interpretado diretamente. Em vez disso, para interpretar, use CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT Varbinário(128) Alterar informação de contexto que pode opcionalmente especificar usando a cláusula WITH como parte de uma instrução INSERT, UPDATE ou DELETE.
<Valor da coluna chave primária> Tal como as colunas da tabela de utilizador Os valores-chave primários para a tabela acompanhada. Estes valores identificam de forma única cada linha na tabela de utilizador.

VERSÃO ALTERÁVEL

Quando VERSION é especificado, uma linha com as colunas seguintes é devolvida.

Nome da coluna Tipo de dados Description
SYS_CHANGE_VERSION bigint Alteração atual do valor da versão associada à linha.

O valor é NULL se uma alteração não tiver sido feita durante um período superior ao período de retenção do acompanhamento de alterações, ou se a linha não tiver sido alterada desde que o acompanhamento de alterações foi ativado.
SYS_CHANGE_CONTEXT Varbinário(128) Alterar informação de contexto que pode opcionalmente especificar usando a cláusula WITH como parte de uma instrução INSERT, UPDATE ou DELETE.
<Valor da coluna chave primária> Tal como as colunas da tabela de utilizador Os valores-chave primários para a tabela acompanhada. Estes valores identificam de forma única cada linha na tabela de utilizador.

Observações

A função CHANGETABLE é normalmente usada na cláusula FROM de uma consulta como se fosse uma tabela.

CHANGETABLE (ALTERAÇÕES...)

Para obter dados de linhas para linhas novas ou modificadas, junte o conjunto de resultados à tabela do utilizador usando as colunas de chave primárias. Apenas uma linha é devolvida para cada linha na tabela de utilizador que foi alterada, mesmo que tenham ocorrido múltiplas alterações na mesma linha desde o valor last_sync_version .

As alterações nas colunas principais nunca são marcadas como atualizações. Se um valor de chave primária mudar, considera-se uma eliminação do valor antigo e uma inserção do novo valor.

Se apagares uma linha e depois inserires uma linha com a antiga chave primária, a alteração é vista como uma atualização de todas as colunas da linha.

Os valores que são devolvidos para as SYS_CHANGE_OPERATION colunas e SYS_CHANGE_COLUMNS são relativos à linha de base (last_sync_version) especificada. Por exemplo, se uma operação de inserção foi feita na versão 10 e uma operação de atualização na versão 15, e se a last_sync_version base for 12, uma atualização será reportada. Se o valor last_sync_version for 8, será reportado um inserto. SYS_CHANGE_COLUMNS nunca reportará as colunas calculadas como tendo sido atualizadas.

Geralmente, todas as operações que inserem, atualizam ou eliminam dados nas tabelas de utilizador são rastreadas, incluindo a instrução MERGE.

As seguintes operações que afetam os dados das tabelas de utilizador não são rastreadas:

  • Executar a UPDATETEXT declaração. Esta declaração está obsoleta e será removida numa versão futura do SQL Server. No entanto, as alterações feitas através da .WRITE cláusula da instrução UPDATE são acompanhadas.

  • Eliminar linhas usando TRUNCATE TABLE. Quando uma tabela é truncada, a informação de versão de acompanhamento de alterações associada à tabela é reiniciada como se o acompanhamento de alterações tivesse acabado de ser ativado na tabela. Uma aplicação cliente deve sempre validar a sua última versão sincronizada. A validação falha se a tabela tiver sido truncada.

CHANGETABLE (VERSÃO...)

Um conjunto de resultados vazio é devolvido se for especificada uma chave primária inexistente.

O valor de SYS_CHANGE_VERSION pode ser NULL se uma alteração não tiver sido feita durante mais tempo do que o período de retenção (por exemplo, a limpeza removeu a informação de alteração) ou se a linha nunca tiver sido alterada desde que o acompanhamento de alterações foi ativado para a tabela.

Permissions

Requer permissão SELECT nas colunas principais principais e VIEW CHANGE TRACKING permissão na tabela especificada pelo <valor table_name> para obter informação de acompanhamento de alterações.

Examples

A. Devolução de linhas para uma sincronização inicial de dados

O exemplo seguinte mostra como obter dados para uma sincronização inicial dos dados da tabela. A consulta devolve todos os dados das linhas e as suas versões associadas. Pode então inserir ou adicionar esses dados ao sistema que conterá os dados sincronizados.

-- 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. Listando todas as alterações feitas desde uma versão específica

O exemplo seguinte lista todas as alterações feitas numa tabela desde a versão especificada (@last_sync_version). [ID EMP] e SSN são colunas numa chave primária composta.

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. Obtenção de todos os dados alterados para uma sincronização

O exemplo seguinte mostra como pode obter todos os dados que mudaram. Esta consulta junta a informação de acompanhamento de alterações com a tabela de utilizador, de modo que a informação da tabela de utilizador é devolvida. A LEFT OUTER JOIN é usado para que uma linha seja devolvida para as linhas eliminadas.

-- 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. Detetar conflitos usando CHANGETABLE(VERSION...)

O exemplo seguinte mostra como atualizar uma linha apenas se a linha não tiver mudado desde a última sincronização. O número de versão da linha específica é obtido usando CHANGETABLE. Se a linha foi atualizada, não são feitas alterações e a consulta devolve informações sobre a alteração mais recente na linha.

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

Ver também

Funções de controlo de alterações (Transact-SQL)
Controlar alterações de dados (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Versão mínima válida para rastreamento de alterações) (Transact-SQL)