Alterar o esquema de uma tabela temporal com controle de versão de sistema

Aplica-se a: SQL Server 2016 (13.x) e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Use a instrução ALTER TABLE para adicionar, alterar ou remover uma coluna.

Comentários

A permissão CONTROL nas tabelas atual e de histórico é necessária para alterar o esquema da tabela temporal.

Durante uma operação ALTER TABLE, o sistema mantém um bloqueio de esquema em ambas as tabelas.

A alteração de esquema especificada é propagada para a tabela de histórico de forma apropriada (dependendo do tipo de alteração).

A adição de colunas varchar(max), nvarchar(max), varbinary(max) ou XML com valores padrão é uma operação de atualização de dados em todas as edições do SQL Server.

Quando o tamanho da linha após a adição da coluna excede o limite de tamanho de linha, não é possível adicionar novas colunas online.

Quando você estender uma tabela com uma nova coluna NOT NULL, considere descartar a restrição padrão na tabela de histórico, já que o sistema preenche automaticamente todas as colunas dessa tabela.

A opção online (WITH (ONLINE = ON) não tem nenhum efeito em ALTER TABLE ALTER COLUMN em tabelas temporais. A coluna ALTER não é executada online, independentemente de qual valor foi especificado para a opção ONLINE.

Não é possível usar ALTER COLUMN para alterar a propriedade IsHidden de colunas de período.

Não é possível usar ALTER direto para as alterações de esquema a seguir. Para esses tipos de alterações, defina SYSTEM_VERSIONING = OFF.

  • Adicionando uma coluna computada
  • Adicionando uma coluna IDENTITY
  • A adição de uma coluna SPARSE ou a alteração de uma coluna existente para ser SPARSE quando a tabela de histórico é definida como DATA_COMPRESSION = PAGE ou DATA_COMPRESSION = ROW, que é o padrão da tabela de histórico.
  • Adicionando um COLUMN_SET
  • Adicionando uma coluna ROWGUIDCOL ou alterando a coluna existente para ROWGUIDCOL
  • Alterando uma coluna NULL para NOT NULL se a coluna contiver valores nulos na tabela atual ou de histórico

Exemplos

R. Alterar o esquema de uma tabela temporal

Aqui estão alguns exemplos que alteram o esquema de tabela temporal.

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. Adicionar colunas de período usando o sinalizador HIDDEN

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

É possível usar ALTER COLUMN <period_column> DROP HIDDEN para limpar o sinalizador oculto em uma coluna de período.

C. Alterar o esquema com SYSTEM_VERSIONING definido como OFF

O exemplo a seguir demonstra como alterar o esquema no qual a configuração SYSTEM_VERSIONING = OFF ainda é necessária (adicionando a coluna IDENTITY). Este exemplo desabilita a verificação de consistência de dados. Essa verificação é desnecessária quando a alteração de esquema é feita dentro de uma transação, uma vez que nenhuma alteração de dados simultânea pode ocorrer.

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;