Informazioni sul rilevamento delle modifiche (SQL Server)About Change Tracking (SQL Server)

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Il rilevamento delle modifiche è una soluzione semplice che consente di rilevare in modo efficiente le modifiche per le applicazioni.Change tracking is a lightweight solution that provides an efficient change tracking mechanism for applications. Per consentire alle applicazioni di eseguire una query per le modifiche apportate ai dati in un database e di accedere alle informazioni correlate, gli sviluppatori di applicazioni dovevano in genere implementare meccanismi di rilevamento delle modifiche personalizzati.Typically, to enable applications to query for changes to data in a database and access information that is related to the changes, application developers had to implement custom change tracking mechanisms. La creazione di tali meccanismi era di solito impegnativa e comportava frequentemente l'uso di una combinazione di trigger, colonne timestamp , nuove tabelle per archiviare le informazioni di rilevamento e processi di pulizia personalizzati.Creating these mechanisms usually involved a lot of work and frequently involved using a combination of triggers, timestamp columns, new tables to store tracking information, and custom cleanup processes.

A tipi diversi di applicazioni sono associati requisiti diversi correlati alla quantità di informazioni necessarie relative alle modifiche.Different types of applications have different requirements for how much information they need about the changes. Il rilevamento delle modifiche può essere utilizzato nelle applicazioni per fornire risposte alle domande seguenti relative alle modifiche apportate a una tabella utente:Applications can use change tracking to answer the following questions about the changes that have been made to a user table:

  • Quali righe sono state modificate per una tabella utente?What rows have changed for a user table?

    • È necessario sapere solo che una riga è stata modificata. Non è necessario sapere il numero di modifiche apportate alla riga o i valori di qualsiasi modifica intermedia.Only the fact that a row has changed is required, not how many times the row has changed or the values of any intermediate changes.

    • Gli ultimi dati possono essere ottenuti direttamente dalla tabella per cui viene eseguito il rilevamento.The latest data can be obtained directly from the table that is being tracked.

  • Una riga è stata modificata?Has a row changed?

    • È necessario sapere che una riga è stata modificata. Le informazioni sulla modifica devono inoltre essere disponibili e devono essere state registrate nel momento in cui la modifica è stata apportata nella stessa transazione.The fact that a row has changed and information about the change must be available and recorded at the time that the change was made in the same transaction.

Nota

Se per un'applicazione è necessario conoscere le informazioni relative a tutte le modifiche apportate e i valori intermedi dei dati modificati, potrebbe risultare appropriato utilizzare la funzionalità Change Data Capture anziché il rilevamento delle modifiche.If an application requires information about all the changes that were made and the intermediate values of the changed data, using change data capture, instead of change tracking, might be appropriate. Per altre informazioni, vedere Informazioni su Change Data Capture (SQL Server).For more information, see About Change Data Capture (SQL Server).

Applicazioni di sincronizzazione unidirezionale e bidirezionaleOne-Way and Two-Way Synchronization Applications

Le applicazioni che devono sincronizzare dati con un'istanza del Motore di database di SQL ServerSQL Server Database Engine devono poter eseguire query per le modifiche.Applications that have to synchronize data with an instance of the Motore di database di SQL ServerSQL Server Database Engine must be able to query for changes. Il rilevamento delle modifiche può essere utilizzato come base per le applicazioni di sincronizzazione unidirezionale e bidirezionale.Change tracking can be used as a foundation for both one-way and two-way synchronization applications.

Applicazioni di sincronizzazione unidirezionaleOne-Way Synchronization Applications

Le applicazioni di sincronizzazione unidirezionale, ad esempio un'applicazione client o un'applicazione di memorizzazione nella cache di livello medio, possono essere compilate in modo che utilizzino il rilevamento delle modifiche.One-way synchronization applications, such as a client or mid-tier caching application, can be built that use change tracking. Come illustrato nella figura seguente, per un'applicazione di memorizzazione nella cache è necessario che i dati siano archiviati nel Motore di databaseDatabase Engine e siano memorizzati nella cache in altri archivi dati.As shown in the following illustration, a caching application requires data to be stored in the Motore di databaseDatabase Engine and to be cached in other data stores. L'applicazione deve essere in grado di mantenere aggiornata la cache con qualsiasi modifica apportata alle tabelle di database.The application must be able to keep the cache up-to-date with any changes that have been made to the database tables. Non è presente alcuna modifica da passare nuovamente al Motore di databaseDatabase Engine.There are no changes to pass back to the Motore di databaseDatabase Engine.

Mostra le applicazioni di sincronizzazione unidirezionaleShows one-way synchronization applications

Applicazioni di sincronizzazione bidirezionaleTwo-Way Synchronization Applications

Anche le applicazioni di sincronizzazione bidirezionale possono essere compilate in modo che utilizzino il rilevamento delle modifiche.Two-way synchronization applications can also be built that use change tracking. In questo scenario i dati contenuti in un'istanza del Motore di databaseDatabase Engine sono sincronizzati con uno o più archivi dati.In this scenario, the data in an instance of the Motore di databaseDatabase Engine is synchronized with one or more data stores. I dati in tali archivi possono essere aggiornati e le modifiche devono essere sincronizzate nuovamente nel Motore di databaseDatabase Engine.The data in those stores can be updated and the changes must be synchronized back to the Motore di databaseDatabase Engine.

Mostra le applicazioni di sincronizzazione bidirezionaleShows two-way synchronization applications

Un valido esempio di applicazione di sincronizzazione bidirezionale è un'applicazione che esegue occasionalmente una connessione.A good example of two-way synchronization application is an occasionally connected application. In questo caso un'applicazione client esegue una query e aggiorna un archivio locale.In this type of application, a client application queries and updates a local store. Quando tra un client e un server è disponibile una connessione, l'applicazione si sincronizzerà con un server e i dati fluiscono in entrambe le direzioni.When a connection is available between a client and server, the application will synchronize with a server, and changed data flows in both directions.

Le applicazioni di sincronizzazione bidirezionale devono essere in grado di rilevare i conflitti.The two-way synchronization applications must be able to detect conflicts. Un conflitto potrebbe verificarsi se gli stessi dati sono stati modificati in entrambi gli archivi dati nel periodo di tempo che intercorre tra le sincronizzazioni.A conflict would occur if the same data was changed in both data stores in the time between synchronizations. Grazie alla possibilità di rilevare conflitti, un'applicazione può garantire che le modifiche non vadano perse.With the ability to detect conflicts, an application can make sure that changes are not lost.

Funzionamento del rilevamento delle modificheHow Change Tracking Works

Per configurare il rilevamento delle modifiche, è possibile utilizzare istruzioni DDL o SQL Server Management StudioSQL Server Management Studio.To configure change tracking, you can use DDL statements or SQL Server Management StudioSQL Server Management Studio. Per altre informazioni, vedere Abilitare e disabilitare il rilevamento delle modifiche (SQL Server).For more information, see Enable and Disable Change Tracking (SQL Server). Per rilevare le modifiche, è necessario innanzitutto abilitare il rilevamento delle modifiche per il database, quindi abilitarlo per le tabelle desiderate all'interno del database stesso.To track changes, change tracking must first be enabled for the database and then enabled for the tables that you want to track within that database. La definizione della tabella non deve essere modificata in alcun modo e non viene creato alcun trigger.The table definition does not have to be changed in any way, and no triggers are created.

Una volta configurato il rilevamento delle modifiche per una tabella, qualsiasi istruzione DML che influisce sulle righe nella tabella causerà la registrazione delle informazioni sul rilevamento delle modifiche per ciascuna riga modificata.After change tracking is configured for a table, any DML statement that affects rows in the table will cause change tracking information for each modified row to be recorded. Per eseguire query per le righe che sono state modificate e per ottenere informazioni sulle modifiche, è possibile usare le funzioni di rilevamento delle modifiche.To query for the rows that have changed and to obtain information about the changes, you can use change tracking functions.

I valori della colonna chiave primaria costituiscono le sole informazioni presenti nella tabella con rilevamento registrate con le informazioni relative alle modifiche.The values of the primary key column is only information from the tracked table that is recorded with the change information. Tali valori identificano le righe modificate.These values identify the rows that have been changed. Per ottenere i dati più recenti per tali righe, un'applicazione può utilizzare i valori della colonna chiave primaria per creare un join tra la tabella di origine e quella con rilevamento.To obtain the latest data for those rows, an application can use the primary key column values to join the source table with the tracked table.

È inoltre possibile utilizzare il rilevamento delle modifiche per ottenere informazioni sulla modifica apportata a ogni riga,Information about the change that was made to each row can also be obtained by using change tracking. ad esempio il tipo di operazione DML che ha provocato la modifica (inserimento, aggiornamento o eliminazione) o le colonne modificate come parte di un'operazione di aggiornamento.For example, the type of DML operation that caused the change (insert, update, or delete) or the columns that were changed as part of an update operation.

Pulizia rilevamento modificheChange Tracking Cleanup

Le informazioni del rilevamento modifiche per tutte le tabelle (abilitata al rilevamento modifiche) vengono archiviate in un rowstore in memoria.Change tracking information for all tables (enabled for Change Tracking) is stored in an in-memory rowstore. A ogni checkpoint, i dati sul rilevamento delle modifiche associati a ogni tabella abilitata al rilevamento modifiche vengono scaricati dal rowstore in memoria alla tabella interna su disco corrispondente.Change tracking data associated with each table enabled for Change Tracking is flushed on every checkpoint from the in-memory rowstore to the corresponding on-disk internal table. Durante il checkpoint, dopo lo spostamento delle righe nelle tabelle su disco, il rowstore in memoria viene inoltre ripulito.During checkpoint, the in-memory rowstore is also purged after the rows are moved to the on-disk tables.

Ogni tabella abilitata al rilevamento modifiche ha una tabella su disco interna, usata dalle funzioni di rilevamento modifiche per determinare la versione di modifica e le righe modificate da una specifica versione.Each table that is enabled for Change Tracking has an internal on-disk table which is used by Change Tracking functions to determine the change version and the rows that have changed since a particular version. Ogni volta che il thread auto cleanup si attiva, analizza tutti i database utente nell'istanza di SQL Server allo scopo di identificare i database abilitati al rilevamento modifiche.Every time the auto cleanup thread wakes up, it scans all the user databases on the SQL Server instance to identify the change tracking enabled databases. In base al periodo di memorizzazione impostato per il database, ogni tabella interna su disco viene ripulita dai record scaduti.Based on the retention period setting of the database, each internal on-disk table is purged of its expired records.

Nei Service Pack per SQL Server 2014SQL Server 2014 e SQL Server 2016SQL Server 2016 è stata aggiunta una stored procedure per la pulizia manuale delle tabelle interne di rilevamento modifiche.A stored procedure was added in Service Packs for SQL Server 2014SQL Server 2014 and SQL Server 2016SQL Server 2016 for performing manual cleanup for the internal Change Tracking internal tables. Altre informazioni sulla stored procedure sono disponibili nell'articolo KB173157.More information about the stored procedure is available in KB173157.

Vedere ancheSee Also

Abilitare e disabilitare il rilevamento delle modifiche (SQL Server) Enable and Disable Change Tracking (SQL Server)
Utilizzare il rilevamento delle modifiche (SQL Server) Work with Change Tracking (SQL Server)
Gestire il rilevamento delle modifiche (SQL Server) Manage Change Tracking (SQL Server)
Rilevare le modifiche ai dati (SQL Server) Track Data Changes (SQL Server)