Modificare lo schema di una tabella temporale con controllo delle versioni di sistema

Si applica a: SQL Server 2016 (13.x) e versioni successive Database SQL di Azure Istanza gestita di SQL di Azure

Usare l'istruzione ALTER TABLE per aggiungere, modificare o rimuovere una colonna.

Osservazioni:

L'autorizzazione CONTROL nelle tabelle correnti e di cronologia è necessaria per modificare lo schema della tabella temporale.

Durante un'operazione ALTER TABLE, il sistema mantiene un blocco dello schema su entrambe le tabelle.

La modifica dello schema specificata viene propagata alla tabella di cronologia in modo appropriato (a seconda del tipo di modifica).

L'aggiunta di varchar(max), nvarchar(max), varbinary(max) o colonne XML con i valori predefiniti è un'operazione di aggiornamento dati in tutte le edizioni di SQL Server.

Se le dimensioni della riga dopo l'aggiunta delle colonne superano il limite di dimensioni della riga, non è possibile aggiungere nuove colonne online.

Dopo aver esteso una tabella con una nuova colonna NOT NULL, eliminare il vincolo predefinito nella tabella di cronologia, poiché il sistema popola automaticamente tutte le colonne della tabella.

L'operazione online (WITH (ONLINE = ON) non influisce su ALTER TABLE ALTER COLUMN in caso di una tabella temporale. La colonna ALTER non viene eseguita come operazione online, indipendentemente dal valore che è stato specificato per l'opzione ONLINE.

È possibile usare ALTER COLUMN per modificare la proprietà IsHidden per le colonne periodo.

Non è possibile usare ALTER direttamente per le seguenti modifiche dello schema. Per questi tipi di modifiche, impostare SYSTEM_VERSIONING = OFF.

  • Aggiunta di una colonna calcolata
  • Aggiunta di una colonna IDENTITY
  • Aggiunta di una colonna SPARSE o modifica della colonna esistente in SPARSE quando la tabella di cronologia è impostata su DATA_COMPRESSION = PAGE o DATA_COMPRESSION = ROW, ovvero il valore predefinito per la tabella di cronologia.
  • Aggiunta di un COLUMN_SET
  • Aggiunta di una colonna ROWGUIDCOLo modifica della colonna esistente in ROWGUIDCOL
  • Modifica di una colonna NULL in NOT NULL se la colonna contiene valori null nella tabella corrente o nella cronologia

Esempi

R. Modificare lo schema di una tabella temporale

Di seguito sono riportati alcuni esempi in cui viene modificato lo schema della tabella temporale.

ALTER TABLE dbo.Department
    ALTER COLUMN DeptName varchar(100);

ALTER TABLE dbo.Department
    ADD WebAddress nvarchar(255) NOT NULL
    CONSTRAINT DF_WebAddress DEFAULT 'www.example.com';

ALTER TABLE dbo.Department
    ADD TempColumn INT;
GO

ALTER TABLE dbo.Department
    DROP COLUMN TempColumn;

B. Aggiungere colonne periodo usando il flag HIDDEN

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

È possibile usare ALTER COLUMN <period_column> DROP HIDDEN per cancellare il flag hidden in una colonna periodo.

C. Modificare lo schema con SYSTEM_VERSIONING impostato su OFF

Il seguente esempio mostra la modifica dello schema in cui l'impostazione SYSTEM_VERSIONING = OFF è comunque necessaria (aggiunta della colonna IDENTITY). Questo esempio disabilita la verifica di coerenza dei dati. Questa verifica non è necessaria quando viene effettuata la modifica dello schema all'interno di una transazione in quanto non possono verificarsi modifiche simultanee dei dati.

BEGIN TRANSACTION

ALTER TABLE [dbo].[CompanyLocation] SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE [CompanyLocation] ADD Cntr INT IDENTITY (1, 1);

ALTER TABLE [dbo].[CompanyLocationHistory]
    ADD Cntr INT NOT NULL
    CONSTRAINT DF_Cntr DEFAULT 0;

ALTER TABLE [dbo].[CompanyLocation] SET
(
    SYSTEM_VERSIONING = ON
    (HISTORY_TABLE = [dbo].[CompanyLocationHistory])
);

COMMIT;