Share via


Abilitazione di Change Data Capture

In questo argomento viene descritto come abilitare Change Data Capture per un database e una tabella.

Abilitazione di Change Data Capture per un database

Prima che sia possibile creare un'istanza di acquisizione per singole tabelle, è innanzitutto necessario che un membro del ruolo predefinito del server sysadmin abiliti il database per Change Data Capture. A tale scopo, eseguire la stored procedure sys.sp_cdc_enable_db (Transact-SQL) nel contesto di database. Per determinare se un database è già abilitato, eseguire una query sulla colonna is_cdc_enabled nella vista del catalogo sys.databases.

Quando un database è abilitato per Change Data Capture, per il database vengono creati lo schema cdc, l'utente cdc, le tabelle dei metadati e altri oggetti di sistema. Lo schema cdc contiene le tabelle di metadati di Change Data Capture e, dopo l'abilitazione della funzionalità, le singole tabelle delle modifiche fungono da repository per i dati delle modifiche. Lo schema cdc contiene inoltre funzioni di sistema associate utilizzate per eseguire query sui dati delle modifiche.

Change Data Capture richiede l'utilizzo esclusivo dello schema cdc e dell'utente cdc. Se in un database è attualmente presente uno schema o un utente di database denominato cdc, il database non può essere abilitato per Change Data Capture fino all'eliminazione o alla ridenominazione dello schema o dell'utente.

Per un esempio di abilitazione di un database, vedere il modello Enable Database for Change Data Capture.

Nota importanteImportante

Per individuare i modelli in SQL Server Management Studio, scegliere Esplora modelli dal menu Visualizza, quindi selezionare Modelli di SQL Server. Change Data Capture è una sottocartella che contiene tutti i modelli a cui si fa riferimento in questo argomento. È inoltre presente un'icona Esplora modelli sulla barra degli strumenti di SQL Server Management Studio.

-- ================================

-- Modello Enable Database for CDC

-- ================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_db
GO

Abilitazione di Change Data Capture per una tabella

Dopo avere abilitato un database per Change Data Capture, i membri del ruolo predefinito del database db_owner possono creare un'istanza di acquisizione per singole tabelle di origine utilizzando la stored procedure sys.sp_cdc_enable_table. Per determinare se una tabella di origine è già stata abilitata per Change Data Capture, esaminare la colonna is_tracked_by_cdc nella vista del catalogo sys.tables.

Quando si crea un'istanza di acquisizione, è possibile specificare le opzioni seguenti:

Columns in the source table to be captured.

Per impostazione predefinita, tutte le colonne della tabella di origine vengono identificate come colonne acquisite. Se è necessario rilevare solo un subset di colonne, ad esempio per motivi di privacy o di prestazioni, utilizzare il parametro @captured\_column\_list per specificare il subset di colonne.

A filegroup to contain the change table.

Per impostazione predefinita, la tabella delle modifiche si trova nel filegroup predefinito del database. I proprietari del database che desiderano controllare il posizionamento di singole tabelle delle modifiche possono utilizzare il parametro @filegroup\_name per specificare un determinato filegroup per la tabella delle modifiche associata all'istanza di acquisizione. È necessario che il filegroup specificato sia già presente. È in genere consigliabile inserire le tabelle delle modifiche in un filegroup distinto dalle tabelle di origine. Per un esempio di utilizzo del parametro @filegroup\_name, vedere il modello Enable a Table Specifying Filegroup Option.

===================================================

-- Modello Enable a Table Specifying Filegroup Option

-- ===================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@filegroup_name = N'MyDB_CT',
@supports_net_changes = 1
GO

A role for controlling access to a change table.

Lo scopo del ruolo specificato consiste nel controllare l'accesso ai dati delle modifiche. Il ruolo specificato può essere un ruolo predefinito del server esistente o un ruolo del database. Se il ruolo specificato non è già presente, verrà automaticamente creato un ruolo del database con il nome indicato. I membri del ruolo sysadmin o db_owner dispongono di accesso completo ai dati nelle tabelle delle modifiche. Tutti gli altri utenti devono disporre dell'autorizzazione SELECT per tutte le colonne acquisite della tabella di origine. Quando viene specificato un ruolo, inoltre, gli utenti che non sono membri del ruolo sysadmin o db_owner devono essere anche membri del ruolo specificato.

Se non si desidera utilizzare un ruolo di controllo, impostare in modo esplicito il parametro @role\_name su Null. Per un esempio di abilitazione di una tabella senza un ruolo di controllo, vedere il modello Enable a Table Without Using a Gating Role.

-- ===================================================

-- Modello Enable a Table Without Using a Gating Role

-- ===================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable>',
@role_name     = NULL,
@supports_net_changes = 1
GO

A function to query for net changes.

Un'istanza di acquisizione includerà sempre una funzione valutata a livello di tabella per la restituzione di tutte le voci della tabella delle modifiche generate in un intervallo definito. Il nome di questa funzione viene creato aggiungendo il nome dell'istanza di acquisizione a "cdc.fn_cdc_get_all_changes_." Per ulteriori informazioni, vedere cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL).

Se il parametro @supports\_net\_changes è impostato su 1, viene generata anche una funzione del rilevamento delle modifiche delta. Questa funzione restituisce solo una modifica per ogni riga distinta modificata nell'intervallo specificato nella chiamata. Per ulteriori informazioni, vedere cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL).

Per supportare le query sulle modifiche delta, è necessario che la tabella di origine disponga di una chiave primaria o di un indice univoco per identificare le righe in modo univoco. Se viene utilizzato un indice univoco, il nome dell'indice deve essere specificato tramite il parametro @index\_name. Le colonne definite nella chiave primaria o nell'indice univoco devono essere incluse nell'elenco delle colonne di origine da acquisire.

Per un esempio di creazione di un'istanza di acquisizione con entrambe le funzioni di query, vedere il modello Enable a Table for All and Net Changes Queries.

=======================================================

-- Modello Enable a Table for All and Net Changes Queries

-- =======================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@supports_net_changes = 1
GO

[!NOTA]

Se Change Data Capture è abilitato in una tabella con una chiave primaria esistente e non viene utilizzato il parametro @index_name per identificare un indice univoco alternativo, la funzionalità Change Data Capture utilizzerà la chiave primaria. Non saranno consentite modifiche successive alla chiave primaria se prima non si disabilita Change Data Capture per la tabella. Questa regola è sempre valida, indipendentemente dal fatto che durante la configurazione di Change Data Capture sia stato o meno richiesto il supporto per le query sulle modifiche delta. Se in una tabella non è presente alcuna chiave primaria al momento dell'abilitazione di Change Data Capture, l'aggiunta successiva di una chiave primaria verrà ignorata da Change Data Capture. Poiché Change Data Capture non utilizzerà una chiave primaria creata in seguito all'abilitazione della tabella, la chiave e le colonne chiave possono essere rimosse senza restrizioni.