다음을 통해 공유


시스템 버전 관리 temporal 테이블의 스키마 변경

적용 대상: SQL Server 2016(13.x) 이상 Azure SQL 데이터베이스 Azure SQL Managed Instance

ALTER TABLE 문을 사용하여 열을 추가, 변경 또는 제거합니다.

설명

temporal 테이블의 스키마를 변경하려면 현재 및 기록 테이블에 대한 CONTROL 권한이 필요합니다.

ALTER TABLE 작업 중 시스템은 두 테이블에 스키마 잠금을 유지합니다.

지정된 스키마 변경은 적절하게 기록 테이블에 전파됩니다(변경 유형에 따라).

기본값으로 varchar(max), nvarchar(max), varbinary(max) 또는 XML 열을 추가하는 것은 모든 버전의 SQL Server에서 업데이트 데이터 작업이 됩니다.

열 추가 후 행 크기가 행 크기 제한을 초과하는 경우 새 열을 온라인에 추가할 수 없습니다.

NOT NULL 열로 테이블을 확장한 후 해당 테이블의 모든 열은 시스템에서 자동으로 채워지므로 기록 테이블에서 기본 제약 조건을 삭제하는 것이 좋습니다.

temporal 테이블에서는 온라인 옵션(WITH (ONLINE = ON)이 ALTER TABLE ALTER COLUMN에 영향을 주지 않습니다. ONLINE 옵션에 지정된 값과 관계없이 ALTER 열은 온라인으로 수행되지 않습니다.

ALTER COLUMN을 사용하여 기간 열에 대한 IsHidden 속성을 변경할 수 있습니다.

다음 스키마 변경에 직접 ALTER를 사용할 수 없습니다. 이러한 종류의 변경은 SYSTEM_VERSIONING = OFF를 설정합니다.

  • 계산 열 추가
  • IDENTITY 열 추가
  • 기록 테이블이 DATA_COMPRESSION = PAGE 또는DATA_COMPRESSION = ROW로 설정된 경우 SPARSE 열 추가 또는 SPARSE가 되도록 기존 열 변경은 기록 테이블에 대한 기본값입니다.
  • COLUMN_SET 추가
  • ROWGUIDCOL 열 추가 또는 ROWGUIDCOL이 되도록 기존 열 변경
  • 열에 현재 또는 기록 테이블에 null 값이 포함된 경우 NULL 열을 NOT NULL로 변경

예제

A. 시스템 버전 관리 temporal 테이블의 스키마 변경

다음은 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. 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을 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 NOT NULL
    CONSTRAINT DF_Cntr DEFAULT 0;

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

COMMIT;