CHANGETABLE (Transact-SQL)

Si applica a:SQL ServerDatabase SQL diAzure Istanza gestita di SQL di Azure

Restituisce informazioni sul rilevamento delle modifiche per una tabella. È possibile utilizzare questa istruzione per restituire tutte le modifiche per una tabella o informazioni sul rilevamento delle modifiche per una riga specifica.

Convenzioni di sintassi Transact-SQL

Sintassi

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 ] )  

Argomenti

CHANGES table_name , last_sync_version
Restituisce informazioni di rilevamento per tutte le modifiche apportate a una tabella che si sono verificate dopo la versione specificata da last_sync_version.

table_name
Tabella definita dall'utente di cui ottenere le modifiche rilevate. Il rilevamento modifiche deve essere abilitato nella tabella. È possibile utilizzare un nome di tabella composto da una, due, tre o quattro parti. Il nome della tabella può esserne un sinonimo.

last_sync_version
Valore scalare bigint nullable. Un'espressione genererà un errore di sintassi. Se il valore è NULL, vengono restituite tutte le modifiche rilevate. Quando ottiene modifiche, l'applicazione chiamante deve specificare il punto dal quale sono richieste le modifiche. L'last_sync_version specifica tale punto. La funzione restituisce informazioni per tutte le righe modificate a partire dalla versione indicata. L'applicazione esegue una query per ricevere modifiche con una versione maggiore di last_sync_version. In genere, prima di ottenere le modifiche, l'applicazione chiamerà CHANGE_TRACKING_CURRENT_VERSION() per ottenere la versione che verrà usata alla successiva modifica. Non è pertanto necessario che l'applicazione interpreti o conosca il valore effettivo. Poiché last_sync_version viene ottenuto dall'applicazione chiamante, l'applicazione deve rendere persistente il valore. In caso di perdita del valore, sarà necessario reinizializzare i dati. last_sync_version deve essere convalidato per assicurarsi che non sia troppo vecchio, perché alcune o tutte le informazioni sulle modifiche potrebbero essere state pulite in base al periodo di conservazione configurato per il database. Per altre informazioni, vedere opzioni CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL) e ALTER DATABASE SET (Transact-SQL).

VERSION table_name, { primary_key_values }
Restituisce le informazioni più recenti sul rilevamento delle modifiche per una riga specificata. I valori della chiave primaria devono consentire di identificare la riga. primary_key_values identifica le colonne chiave primaria e specifica i valori. I nomi delle colonne chiave primaria possono essere specificati in qualsiasi ordine.

table_name
Tabella definita dall'utente di cui ottenere le informazioni sul rilevamento delle modifiche. Il rilevamento modifiche deve essere abilitato nella tabella. È possibile utilizzare un nome di tabella composto da una, due, tre o quattro parti. Il nome della tabella può esserne un sinonimo.

column_name
Specifica il nome della colonna o delle colonne chiave primaria. È possibile specificare in qualsiasi ordine più nomi di colonna.

value
Il valore della chiave primaria. Se sono presenti più colonne chiave primaria, i valori devono essere specificati nello stesso ordine delle colonne visualizzate nell'elenco column_name .

[ FORCESEEK ]
Si applica a: SQL Server (a partire da SQL Server 2016 (13.x) SP2 CU16, SQL Server 2017 (14.x) CU24 e SQL Server 2019 (15.x) CU11), database SQL di Azure e Istanza gestita di SQL di Azure

Parametro facoltativo che forza l'uso di un'operazione seek per accedere al table_name. In alcuni casi in cui sono state modificate pochissime righe, è comunque possibile usare un'operazione di analisi per accedere alla table_name. Se un'operazione di analisi introduce un problema di prestazioni, usare il FORCESEEK parametro .

[AS] table_alias [ (column_alias [ ,...n ] ) ] ]
Fornisce nomi per i risultati restituiti da CHANGETABLE.

table_alias
Nome alias della tabella restituito da CHANGETABLE. table_alias è obbligatorio e deve essere un identificatore valido.

column_alias
Alias di colonna facoltativo o elenco di alias di colonna per le colonne restituite da CHANGETABLE. Consente la personalizzazione dei nomi di colonna in caso di nomi duplicati nei risultati.

Tipi restituiti

table

Valori restituiti

CHANGETABLE CHANGES

Specificando CHANGES, vengono restituite zero o più righe che presentano le colonne seguenti.

Nome colonna Tipo di dati Descrizione
SYS_CHANGE_VERSION bigint Valore della versione associato all'ultima modifica alla riga
SYS_CHANGE_CREATION_VERSION bigint Valori della versione associati all'ultima operazione di inserimento.
SYS_CHANGE_OPERATION nchar(1) Specifica il tipo di modifica:

U = Aggiornamento

I = Inserisci

D = Eliminazione
SYS_CHANGE_COLUMNS varbinary(4100) Vengono elencate le colonne modificate a partire da last_sync_version (versione di riferimento). Si noti che le colonne calcolate non vengono mai elencate come modificate.

Il valore è NULL quando viene soddisfatta una o più delle condizioni seguenti:

Il rilevamento delle modifiche per le colonne non è abilitato.

L'operazione è di inserimento o di eliminazione.

Tutte le colonne chiave non primaria sono state aggiornate in un'unica operazione. Questo valore binario non deve essere interpretato direttamente. Per interpretarlo, usare invece CHANGE_TRACKING_IS_COLUMN_IN_MASK().
SYS_CHANGE_CONTEXT varbinary(128) Modificare le informazioni di contesto che è possibile specificare facoltativamente usando la clausola WITH come parte di un'istruzione INSERT, UPDATE o DELETE.
<valore della colonna chiave primaria> Come per le colonne della tabella utente Valori della chiave primaria per la tabella rilevata. Questi valori identificano in modo univoco ogni riga nella tabella utente.

CHANGETABLE VERSION

Quando si specifica VERSION, viene restituita una riga con le colonne seguenti.

Nome colonna Tipo di dati Descrizione
SYS_CHANGE_VERSION bigint Il valore della versione corrente associato alla riga.

Il valore è NULL se non è stata effettuata alcuna modifica per un periodo superiore a quello di memorizzazione del rilevamento delle modifiche, oppure se la riga non è stata modificata a partire dall'abilitazione del rilevamento delle modifiche.
SYS_CHANGE_CONTEXT varbinary(128) Modificare le informazioni di contesto specificabili liberamente utilizzando la clausola WITH come parte di un'istruzione INSERT, UPDATE o DELETE.
<valore della colonna chiave primaria> Come per le colonne della tabella utente Valori della chiave primaria per la tabella rilevata. Questi valori identificano in modo univoco ogni riga nella tabella utente.

Osservazioni:

La funzione CHANGETABLE è in genere utilizzata nella clausola FROM di una query come se si trattasse di una tabella.

CHANGETABLE(CHANGES...)

Per ottenere i dati delle righe per le righe nuove o modificate, unire il set di risultati alla tabella utente utilizzando le colonne chiave primaria. Per ogni riga della tabella utente modificata viene restituita una sola riga, anche se sono state apportate più modifiche alla stessa riga dal valore last_sync_version .

Le modifiche alla colonna chiave primaria non vengono mai contrassegnate come aggiornamenti. Se il valore della chiave primaria cambia, ciò viene considerato come un'eliminazione del valore obsoleto e un inserimento del nuovo valore.

Se si elimina una riga per poi inserire una riga con la chiave primaria obsoleta, la modifica viene considerata come un aggiornamento per tutte le colonne nella riga.

I valori restituiti per le SYS_CHANGE_OPERATION colonne e SYS_CHANGE_COLUMNS sono relativi alla linea di base (last_sync_version) specificata. Ad esempio, se è stata eseguita un'operazione di inserimento alla versione 10 e un'operazione di aggiornamento alla versione 15e se il last_sync_version di base è 12, verrà segnalato un aggiornamento. Se il valore last_sync_version è 8, verrà segnalato un inserimento. SYS_CHANGE_COLUMNS non segnala mai le colonne calcolate come aggiornate.

Generalmente, vengono rilevate tutte le operazioni che consentono di inserire, aggiornare o eliminare i dati nelle tabelle utente, inclusa l'istruzione MERGE.

Le operazioni seguenti che influiscono sui dati delle tabelle utente non vengono rilevate:

  • Esecuzione dell'istruzione UPDATETEXT . Questa istruzione è deprecata e verrà rimossa in una versione futura di SQL Server. Tuttavia, vengono rilevate le modifiche apportate tramite la .WRITE clausola dell'istruzione UPDATE.

  • Eliminazione di righe tramite TRUNCATE TABLE. Quando una tabella viene troncata, le informazioni sulla versione del rilevamento delle modifiche associata alla tabella vengono reimpostate, come se il rilevamento delle modifiche fosse stato appena abilitato nella tabella. Un'applicazione client deve sempre convalidare l'ultima versione sincronizzata. La convalida non riesce se la tabella è stata troncata.

CHANGETABLE(VERSION...)

Se viene specificata una chiave primaria inesistente, viene restituito un set di risultati vuoto.

Il valore di SYS_CHANGE_VERSION potrebbe essere NULL se una modifica non è stata apportata per più tempo rispetto al periodo di conservazione (ad esempio, la pulizia ha rimosso le informazioni sulle modifiche) o la riga non è mai stata modificata dopo l'abilitazione del rilevamento delle modifiche per la tabella.

Autorizzazioni

È necessaria l'autorizzazione SELECT per le colonne di chiave primaria e VIEW CHANGE TRACKING l'autorizzazione per la tabella specificata dal <valore table_name> per ottenere informazioni sul rilevamento delle modifiche.

Esempi

R. Restituzione delle righe per una sincronizzazione iniziale dei dati

Nell'esempio seguente viene illustrato come ottenere i dati per una sincronizzazione iniziale dei dati della tabella. La query restituisce tutti i dati delle righe e le relative versioni associate. Sarà quindi possibile inserire o aggiungere tali dati al sistema che conterrà i dati sincronizzati.

-- 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. Elenco di tutte le modifiche effettuate a partire da una versione specifica

Nell'esempio seguente viene illustrato come elencare tutte le modifiche effettuate in una tabella a partire dalla versione specificata (@last_sync_version). [Emp ID] e SSN sono colonne in una chiave primaria 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. Acquisizione di tutti i dati modificati per una sincronizzazione

Nell'esempio seguente viene illustrato come ottenere tutti i dati modificati. La query unisce le informazioni sul rilevamento delle modifiche alla tabella utente, in modo da restituire le informazioni sulla tabella utente. Utilizzando un LEFT OUTER JOIN viene restituita una riga per le righe eliminate.

-- 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. Rilevamento di conflitti utilizzando CHANGETABLE(VERSION...)

Nell'esempio seguente viene illustrato come aggiornare una riga che non ha subito modifiche dall'ultima sincronizzazione. Il numero di versione della riga specifica si ottiene utilizzando CHANGETABLE. Se la riga è stata aggiornata, le modifiche non vengono effettuate e la query restituisce informazioni sulla sua modifica più recente.

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

Vedi anche

Funzioni di rilevamento modifiche (Transact-SQL)
Tenere traccia delle modifiche ai dati (SQL Server)
CHANGE_TRACKING_IS_COLUMN_IN_MASK (Transact-SQL)
CHANGE_TRACKING_CURRENT_VERSION (Transact-SQL)
CHANGE_TRACKING_MIN_VALID_VERSION (Transact-SQL)