Dela via


Ändra schemat för en systemversionsbaserad temporal tabell

gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Använd instruktionen ALTER TABLE för att lägga till, ändra eller ta bort en kolumn.

Anmärkningar

CONTROL behörighet för aktuella tabeller och historiktabeller krävs för att ändra schemat för tidstabellen.

Under en ALTER TABLE åtgärd har systemet ett schemalås på båda tabellerna.

Den angivna schemaändringen sprids till historiktabellen på rätt sätt (beroende på typ av ändring).

Att lägga till varchar(max), nvarchar(max), varbinary(max) eller XML-kolumner med standardvärden, är en uppdateringsdataåtgärd för alla utgåvor av SQL Server.

Om radstorleken efter kolumntillägget överskrider radstorleksgränsen kan nya kolumner inte läggas till online.

När du utökar en tabell med en ny NOT NULL kolumn bör du överväga att ta bort standardvillkoret för historiktabellen, eftersom systemet automatiskt fyller i alla kolumner i tabellen.

Onlinealternativet (WITH (ONLINE = ON) har ingen effekt på ALTER TABLE ALTER COLUMN med temporala tabeller. ALTER kolumnen utförs inte som online, oavsett vilket värde som har angetts för ONLINE alternativet.

Du kan använda ALTER COLUMN för att ändra egenskapen IsHidden för periodkolumner.

Du kan inte använda direkt ALTER för följande schemaändringar. För dessa typer av ändringar anger du SYSTEM_VERSIONING = OFF.

  • Lägga till en beräknad kolumn
  • Lägga till en IDENTITY kolumn
  • Lägga till en SPARSE kolumn eller ändra befintlig kolumn så att den SPARSE när historiktabellen är inställd på DATA_COMPRESSION = PAGE eller DATA_COMPRESSION = ROW, vilket är standardvärdet för historiktabellen.
  • Lägga till en COLUMN_SET
  • Lägga till en ROWGUIDCOL kolumn eller ändra befintlig kolumn till ROWGUIDCOL
  • Ändra en NULL kolumn till NOT NULL om kolumnen innehåller null-värden i den aktuella tabellen eller historiktabellen

Exempel

A. Ändra schemat för en temporal tabell

Här är några exempel som ändrar schemat för temporaltabellen.

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. Lägg till periodkolumner med hjälp av flaggan HIDDEN

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

Du kan använda ALTER COLUMN <period_column> DROP HIDDEN för att rensa den dolda flaggan i en periodkolumn.

C. Ändra schemat med SYSTEM_VERSIONING inställt på OFF

I följande exempel visas hur du ändrar schemat där inställningen SYSTEM_VERSIONING = OFF fortfarande krävs (lägga till en IDENTITY kolumn). Det här exemplet inaktiverar datakonsekvenskontrollen. Den här kontrollen är onödig när schemaändringen görs i en transaktion eftersom inga samtidiga dataändringar kan göras.

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;