Изменение структуры системно-версионированной темпоральной таблицы

Относится к: SQL Server 2016 (13.x) и более поздние версии База данных SQL AzureУправляемый экземпляр SQL AzureSQL Database в Microsoft Fabric

Используйте инструкцию ALTER TABLE для добавления, изменения или удаления столбца.

Remarks

Для изменения схемы временной таблицы нужно CONTROL разрешение на текущие и исторические таблицы.

Во время ALTER TABLE операции система держит блокировку схемы на обеих таблицах.

ядро СУБД распространяет изменение схемы в таблицу истории, в зависимости от типа изменения.

Добавление столбцов varchar(max), nvarchar(max), varbinary(max) или xml с настройками по умолчанию — это операция обновления данных во всех редакциях SQL Server.

Если размер строки после добавления столбца превышает лимит, вы не сможете добавить новые столбцы онлайн.

После расширения таблицы с новым NOT NULL столбцом рекомендуется удалить ограничение по умолчанию в таблице журнала, так как система автоматически заполняет все столбцы в этой таблице.

Параметр online (WITH (ONLINE = ON) не влияет на темпоральные таблицы ALTER TABLE ALTER COLUMN. Операция ALTER столбца не запускается онлайн, независимо от того, какое значение вы указали для этой ONLINE опции.

Можно использовать ALTER COLUMN для изменения IsHidden свойства для столбцов периодов.

Вы не можете использовать прямой ALTER для следующих изменений схемы. Для этих типов изменений задайте SYSTEM_VERSIONING = OFF.

  • добавление вычисляемого столбца;
  • Добавление столбца IDENTITY
  • Добавление столбца SPARSE или изменение существующего столбца на SPARSE, когда для таблицы истории задано значение DATA_COMPRESSION = PAGE или DATA_COMPRESSION = ROW, что является значением по умолчанию для таблицы истории.
  • Добавление COLUMN_SET
  • Добавление ROWGUIDCOL столбца или изменение существующего столбца на ROWGUIDCOL
  • Изменение столбца NULL на NOT NULL, если столбец содержит значения NULL в текущей или исторической таблице.

Examples

А. Изменение схемы темпоральной таблицы

Вот несколько примеров, которые изменяют схему временной таблицы.

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

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

ALTER TABLE dbo.Department
    ADD TempColumn INT;
GO

ALTER TABLE dbo.Department
    DROP COLUMN TempColumn;

B. Добавьте столбцы периодов, используя флаг HIDDEN

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

Можно использовать ALTER COLUMN <period_column> DROP HIDDEN для очистки скрытого флага в столбце периода.

C. Измените схему с параметром SYSTEM_VERSIONING set to OFF

В следующем примере показано, как изменить схему, если по-прежнему требуется задать SYSTEM_VERSIONING = OFF (добавив столбец IDENTITY). В этом примере отключена проверка согласованности данных. Эта проверка не нужна при внесении изменения схемы внутри транзакции, так как одновременное изменение данных не может происходить.

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
        CONSTRAINT DF_Cntr DEFAULT 0 NOT NULL;

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

COMMIT TRANSACTION;