sys.sp_cdc_enable_table (Transact-SQL)

Abilita l'acquisizione dei dati delle modifiche per la tabella di origine specificata nel database corrente. Quando una tabella viene abilitata per Change Data Capture, un record di ogni operazione DML (Data Manipulation Language) applicata alla tabella viene scritto nel log delle transazioni. Il processo Change Data Capture recupera queste informazioni dal log e le scrive nelle tabelle delle modifiche accessibili mediante un set di funzioni.

Change Data Capture è disponibile solo nelle edizioni Enterprise e Developer e nella copia di valutazione di SQL Server 2008.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

sys.sp_cdc_enable_table 
    [ @source_schema = ] 'source_schema', 
    [ @source_name = ] 'source_name' ,
    [ @role_name = ] 'role_name'
    [,[ @capture_instance = ] 'capture_instance' ]
    [,[ @supports_net_changes = ] supports_net_changes ]
    [,[ @index_name = ] 'index_name' ]
    [,[ @captured_column_list = ] 'captured_column_list' ]
    [,[ @filegroup_name = ] 'filegroup_name' ]
  [,[ @partition_switch = ] 'partition_switch' ]

Argomenti

  • [ @source_schema = ] 'source_schema'
    Nome dello schema cui appartiene la tabella di origine. source_schema è di tipo sysname, senza impostazione predefinita e non può essere NULL.

  • [ @source_name = ] 'source_name'
    Nome della tabella di origine in cui è possibile abilitare la funzionalità Change Data Capture. source_name è di tipo sysname, senza impostazione predefinita e non può essere NULL.

    source_name deve esistere nel database corrente. Non è possibile abilitare l'acquisizione dei dati delle modifiche per le tabelle nello schema cdc.

  • [ @role_name = ] 'role_name'
    Nome del ruolo del database utilizzato per controllare l'accesso ai dati delle modifiche. role_name è di tipo sysname e deve essere specificato. Se viene impostato in modo esplicito su NULL, non viene utilizzato alcun ruolo di controllo per limitare l'accesso ai dati delle modifiche.

    Il ruolo viene utilizzato se esiste. Se il ruolo non esiste, viene eseguito un tentativo per creare un ruolo del database con il nome specificato. Nel nome del ruolo vengono eliminati gli spazi vuoti nella parte destra della stringa prima di provare a creare il ruolo. Se il chiamante non è autorizzato a creare un ruolo all'interno del database, non è possibile eseguire l'operazione della stored procedure.

  • [ @capture_instance = ] 'capture_instance'
    Nome dell'istanza di acquisizione utilizzato per denominare gli oggetti Change Data Capture specifici dell'istanza. capture_instance è di tipo sysname e non può essere NULL.

    Se non è specificato, il nome deriva dal nome dello schema di origine più il nome della tabella di origine nel formato schemaname_sourcename. capture_instance non può superare i 100 caratteri e deve essere univoco nel database. Indipendentemente dal fatto che sia specificato o derivato, in capture_instance vengono eliminati gli spazi vuoti nella parte destra della stringa.

    Una tabella di origine può avere un massimo di due istanze di acquisizione. Per ulteriori informazioni, vedere sys.sp_cdc_help_change_data_capture (Transact-SQL).

  • [ @supports_net_changes = ] supports_net_changes
    Indica se deve essere abilitato il supporto per l'esecuzione di query per le modifiche delta per questa istanza di acquisizione. supports_net_changes è di tipo bit con un valore predefinito di 1 se la tabella dispone di una chiave primaria o se la tabella dispone di un indice univoco identificato mediante il parametro @index_name. In caso contrario, il valore predefinito del parametro è 0.

    Se è 0, vengono generate solo le funzioni di supporto per l'esecuzione di query per tutte le modifiche.

    Se è 1, vengono generate le funzioni necessarie per l'esecuzione di query per le modifiche delta.

    Se supports_net_changes è impostato su 1, è necessario specificare index_name oppure la tabella di origine deve avere una chiave primaria definita.

  • [ @index_name = ] **'**index_name'
    Nome di un indice univoco da utilizzare per identificare in modo univoco le righe nella tabella di origine. index_name è di tipo sysname e può essere NULL. Se specificato, index_name deve essere un indice univoco valido nella tabella di origine. Se viene specificato index_name, le colonne indice identificate hanno la precedenza su tutte le colonne chiave primaria definite come identificatore di riga univoco per la tabella.

  • [ @captured_column_list = ] 'captured_column_list'
    Identifica le colonne della tabella di origine da includere nella tabella delle modifiche. captured_column_list è di tipo nvarchar(max) e può essere NULL. Se il valore è NULL, nella tabella delle modifiche vengono incluse tutte le colonne.

    I nomi delle colonne devono essere colonne valide nella tabella di origine. È necessario includere le colonne definite in un indice della chiave primaria o le colonne definite in un indice a cui fa riferimento index_name.

    captured_column_list è un elenco di nomi di colonne separati da virgole. I nomi delle singole colonne all'interno dell'elenco possono essere racchiusi tra virgolette ("") o parentesi quadrate ([]). Se un nome di una colonna contiene una virgola incorporata, il nome della colonna deve essere racchiuso tra virgolette.

    captured_column_list non può contenere i seguenti nomi di colonna riservati: __$start_lsn, __$end_lsn, __$seqval, __$operation e __$update_mask.

  • [ @filegroup_name = ] 'filegroup_name'
    Filegroup da utilizzare per la tabella delle modifiche creata per l'istanza di acquisizione. filegroup_name è di tipo sysname e può essere NULL. Se specificato, filegroup_name deve essere definito per il database corrente. Se il valore è NULL; viene utilizzato il filegroup predefinito.

    Si consiglia di creare un filegroup separato per modificare le tabelle di acquisizione dei dati delle modifiche. Per ulteriori informazioni, vedere Configurazione di Change Data Capture.

  • [ @allow_partition_switch= ] 'allow_partition_switch'
    Indica se il comando SWITCH PARTITION di ALTER TABLE può essere eseguito su una tabella abilitata per Change Data Capture. allow_partition_switch è di tipo bit e il valore predefinito è 1.

    Per le tabelle non partizionate, l'impostazione di cambio è sempre 1 mentre l'impostazione effettiva viene ignorata. Se il cambio viene impostato in modo esplicito su 0 per una tabella non partizionata, viene generato l'avviso 22857 per indicare che è stata ignorata l'impostazione di cambio. Se il cambio viene impostato in modo esplicito su 0 per una tabella partizionata, viene generato l'avviso 22356 per indicare che non saranno consentite operazioni di cambio partizione nella tabella di origine. Infine, se l'impostazione di cambio viene impostata in modo esplicito su 1 o viene utilizzato 1 come valore predefinito e la tabella abilitata viene partizionata, viene generato l'avviso 22855 per indicare che i cambi di partizione non saranno bloccati. Se si verifica un cambio di partizione, Change Data Capture non rileverà le modifiche risultanti dal cambio. In questo modo verranno generate inconsistenze dei dati quando vengono utilizzati i dati delle modifiche.

    Nota importanteImportante

    SWITCH PARTITION è un'operazione eseguita sui metadati, ma apporta modifiche anche ai dati. Le modifiche dei dati associate a tale operazione non vengono acquisite nella tabella delle modifiche di Change Data Capture. Si consideri ad esempio una tabella in cui sono presenti tre partizioni cui vengono apportate modifiche. Il processo di acquisizione registrerà le operazioni di inserimento, aggiornamento ed eliminazione eseguite sulla tabella dall'utente. Tuttavia, se una partizione è stata trasferita in un'altra tabella, ad esempio per l'esecuzione di un'eliminazione bulk, le righe spostate come parte di questa operazione non verranno acquisite come righe eliminate nella tabella di modifica. Analogamente, se alla tabella viene aggiunta una nuova partizione in cui sono presenti righe che contengono dati, tali righe non verranno riflesse nella tabella di modifica. Questa situazione può provocare incoerenza tra i dati quando le modifiche vengono utilizzate da un'applicazione e applicate a una destinazione.

Valori restituiti

0 (esito positivo) o 1 (esito negativo)

Set di risultati

Nessuno

Osservazioni

Prima di abilitare una tabella per Change Data Capture, è necessario abilitare il database. Per determinare se il database è abilitato per Change Data Capture, eseguire una query sulla colonna is_cdc_enabled nella vista del catalogo sys.databases. Per abilitare il database, utilizzare la stored procedure sys.sp_cdc_enable_db.

Quando Change Data Capture viene abilitato per una tabella, vengono generate una tabella delle modifiche e una o due funzioni di query. La tabella delle modifiche viene utilizzata come repository per le modifiche della tabella di origine estratte dal log delle transazioni dal processo di acquisizione. Le funzioni di query vengono utilizzate per estrarre i dati dalla tabella delle modifiche. I nomi di queste funzioni sono derivati dal parametro capture_instance nei modi seguenti:

  • Funzione di rilevamento di tutte le modifiche: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Funzione di rilevamento delle modifiche delta: cdc.fn_cdc_get_net_changes_<capture_instance>

sys.sp_cdc_enable_table crea anche i processi di acquisizione e pulizia per il database se la tabella di origine è la prima tabella nel database da abilitare per Change Data Capture e non esiste alcuna pubblicazione transazionale per il database. Imposta la colonna is_tracked_by_cdc nella vista del catalogo sys.tables su 1.

Nota

SQL Server Agent non deve essere in esecuzione quando Change Data Capture viene abilitato per una tabella. Tuttavia, il processo di acquisizione elaborerà il log delle transazioni e scriverà voci nella tabella delle modifiche solo se SQL Server Agent è in esecuzione.

Autorizzazioni

È richiesta l'appartenenza al ruolo predefinito del database db_owner.

Esempi

A. Abilitazione dell'acquisizione dei dati delle modifiche tramite l'indicazione dei parametri obbligatori

Nell'esempio seguente viene abilitata l'acquisizione dei dati delle modifiche per la tabella HumanResources.Employee. Vengono specificati solo i parametri obbligatori.

USE AdventureWorks2008R2;
GO
EXECUTE sys.sp_cdc_enable_table
    @source_schema = N'HumanResources'
  , @source_name = N'Employee'
  , @role_name = N'cdc_Admin';
GO

B. Abilitazione di Change Data Capture tramite l'indicazione di parametri aggiuntivi facoltativi

Nell'esempio seguente viene abilitata l'acquisizione dei dati delle modifiche per la tabella HumanResources.Department. Vengono specificati tutti i parametri tranne @allow_partition_switch.

USE AdventureWorks2008R2;
GO
EXEC sys.sp_cdc_enable_table
    @source_schema = N'HumanResources'
  , @source_name = N'Department'
  , @role_name = N'cdc_admin'
  , @capture_instance = N'HR_Department' 
  , @supports_net_changes = 1
  , @index_name = N'AK_Department_Name' 
  , @captured_column_list = N'DepartmentID, Name, GroupName' 
  , @filegroup_name = N'PRIMARY';
GO