원장 고려 사항 및 제한 사항

적용 대상: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

시스템 버전 관리 및 변경이 불가능한 데이터의 특성으로 인해 원장 테이블을 사용하는 경우 고려해야 할 몇 가지 고려 사항 및 제한 사항이 있습니다.

일반적인 고려 사항 및 제한 사항

원장 테이블 관련 작업을 수행할 때는 다음 사항을 고려해야 합니다.

  • 원장 속성이 설정된 데이터베이스인 원장 데이터베이스는 원장 속성이 해제된 일반 데이터베이스로 변환할 수 없습니다.
  • 데이터베이스 다이제스트의 자동 생성 및 스토리지는 현재 Azure SQL Database에서 사용할 수 있지만 SQL Server에서는 지원되지 않습니다.
  • Azure Storage 변경이 불가능한 Blob을 사용하는 원장 테이블이 포함된 자동화 다이제스트 관리는 사용자가 LRS(로컬 중복 스토리지) 계정을 사용할 수 있는 기능을 제공하지 않습니다.
  • 원장 데이터베이스를 만들면 기본적으로 데이터베이스에서 절을 APPEND_ONLY = ON 지정하지 않고 만든 모든 새 테이블은 업데이트 가능한 원장 테이블이 됩니다. 추가 전용 원장 테이블을 만들려면 CREATE TABLE(Transact-SQL) 문에서 APPEND_ONLY = ON 절을 사용합니다.
  • 트랜잭션은 최대 200개 원장 테이블을 업데이트할 수 있습니다.

원장 테이블 고려 사항 및 제한 사항

  • 원장 테이블이 아닌 데이터베이스의 기존 테이블은 원장 테이블로 변환할 수 없습니다. 자세한 내용은 일반 테이블에서 원장 테이블로 데이터 마이그레이션을 참조하세요.
  • 원장 테이블을 만든 후에는 원장 테이블이 아닌 테이블에 되돌리기 수 없습니다.
  • 추가 전용 원장 테이블 또는 업데이터 가능한 원장 테이블기록 테이블에서 이전 데이터를 삭제하는 것은 지원되지 않습니다.
  • TRUNCATE TABLE는 지원되지 않습니다.
  • 업데이트 가능한 원장 테이블 이 생성되면 원장 테이블에 4개의 GENERATED ALWAYS 열이 추가됩니다. 추가 전용 원장 테이블은 원장 테이블에 두 개의 열을 추가합니다. 이러한 새 열은 Azure SQL Database에서 지원되는 최대 열 수(1,024)에 대해 계산됩니다.
  • 메모리 내 테이블은 지원되지 않습니다.
  • 스파스 열 집합은 지원되지 않습니다.
  • SWITCH IN/OUT 파티션은 지원되지 않습니다.
  • DBCC CLONEDATABASE는 지원되지 않습니다.
  • 원장 테이블에는 전체 텍스트 인덱스를 사용할 수 없습니다.
  • 원장 테이블은 그래프 테이블일 수 없습니다.
  • 원장 테이블은 FileTable일 수 없습니다.
  • 클러스터형 columnstore 인덱스가 있는 경우 원장 테이블에는 rowstore 비클러스터형 인덱스가 있을 수 없습니다.
  • 변경 내용 추적은 기록 테이블에서 허용되지 않지만 원장 테이블에서 허용됩니다.
  • 변경 데이터 캡처는 기록 테이블에서 허용되지 않지만 원장 테이블에서 허용됩니다.
  • 트랜잭션 복제는 원장 테이블에서 지원되지 않습니다.
  • 데이터베이스 미러링은 지원되지 않습니다.
  • Azure Synapse Link는 지원되지만 기록 테이블이 아닌 원장 테이블에 대해서만 지원됩니다.
  • 데이터베이스 백업을 Azure SQL Managed Instance로 네이티브 복원한 후 다이제스트 경로를 수동으로 변경합니다.
  • Managed Instance 링크를 Azure SQL Managed Instance에 만든 후 다이제스트 경로를 수동으로 변경합니다.
  • SQL 데이터 동기화 원장 테이블에서는 지원되지 않습니다.

지원되지 않는 데이터 형식

  • XML
  • SqlVariant
  • 사용자 정의 데이터 형식
  • FILESTREAM

Temporal 테이블 제한 사항

업트럴 원장 테이블은 임시 테이블기술을 기반으로 하며 대부분의 제한 사항을 상속하지만 전부는 상속하지 않습니다. 다음은 temporal 테이블에서 상속되는 제한 사항 목록입니다.

  • 기록 테이블 생성 도중 기록 테이블의 이름을 지정하는 경우 스키마 및 테이블 이름과 원장 뷰의 이름을 지정해야 합니다.
  • 기본적으로 기록 테이블은 PAGE 압축됩니다.
  • 구성 분할은 현재 테이블에서 기록 테이블로 자동 복제를 수행하지 않기 때문에 현재 테이블이 분할된 경우 기록 테이블은 기본 파일 그룹에 생성됩니다.
  • Temporal 및 기록 테이블은 FILETABLE일 수 없고 FILESTREAM을 제외한 모든 지원되는 데이터 형식의 열을 포함할 수 있습니다. FILETABLE 및 FILESTREAM은 SQL Server 외부에서의 데이터 조작을 허용하므로 시스템 버전 관리를 보장할 수 없습니다.
  • 노드 또는 에지 테이블을 temporal 테이블로 만들거나 변경할 수 없습니다. Graph는 원장에서 지원되지 않습니다.
  • temporal 테이블은 Blob 데이터 형식(예: (n)varchar(max), varbinary(max)(n)textimage)을 지원하지만 상당한 스토리지 비용이 발생하고 크기 때문에 성능에 영향을 줍니다. 따라서 이러한 데이터 유형을 사용하는 경우 시스템 설계 시 유의해야 합니다.
  • 기록 테이블은 현재 테이블과 동일한 데이터베이스에 만들어야 합니다. Linked Server에서의 임시 쿼리는 지원되지 않습니다.
  • 기록 테이블은 제약 조건(기본 키, 외래 키, 테이블 또는 열 제약 조건)을 가질 수 없습니다.
  • 시스템 버전 관리 temporal 테이블에서는 온라인 옵션(WITH (ONLINE = ON)이 ALTER TABLE ALTER COLUMN에 영향을 주지 않습니다. ONLINE 옵션에 지정된 값과 관계없이 ALTER COLUMN은 온라인으로 수행되지 않습니다.
  • INSERTUPDATE 문은 GENERATED ALWAYS 열을 참조할 수 없습니다. 이러한 열에 직접 값을 삽입하려는 시도는 차단됩니다.
  • UPDATETEXTWRITETEXT 는 지원되지 않습니다.
  • 기록 테이블에 대한 트리거는 허용되지 않습니다.
  • 복제본(replica) 기술의 사용은 제한됩니다.
    • Always On: 완전히 지원됨
    • 스냅샷, 병합 및 트랜잭션 복제: temporal 테이블에 지원되지 않음
  • 일련의 기록 테이블에서 기록 테이블은 현재 테이블로 구성될 수 있습니다.
  • 다음 개체 또는 속성은 기록 테이블을 만들 때 현재 테이블에서 기록 테이블로 복제본(replica) 없습니다.
    • 기간 정의
    • ID 정의
    • 인덱스
    • 통계
    • CHECK 제약 조건
    • 트리거
    • 분할 구성
    • 사용 권한
    • 행 수준 보안 조건자

스키마 변경 고려 사항

열 추가

Nullable 열 추가가 지원됩니다. null을 허용하지 않는 열 추가는 지원되지 않습니다. 원장은 행 버전의 해시를 계산할 때 NULL 값을 무시하도록 설계되었습니다. 이에 따라 null 허용 열이 추가되면 원장은 새 열을 포함하도록 원장 및 기록 테이블의 스키마를 수정합니다. 하지만 이는 기존 행의 해시에 영향을 주지 않습니다. 원장 테이블에 열을 추가하면 sys.ledger_column_history에 캡처됩니다.

열 및 테이블 삭제

일반적으로 열 또는 테이블을 삭제하면 데이터베이스에서 기본 데이터가 완전히 지워지고 데이터를 변경할 수 없어야 하는 원장 기능과 근본적으로 호환되지 않습니다. 원장은 데이터를 삭제하는 대신 단지 삭제되는 개체의 이름을 변경하므로 데이터가 사용자 스키마에서 논리적으로 제거되지만 실제로는 데이터베이스에 유지됩니다. 삭제된 열은 원장 테이블 스키마에서도 숨겨지므로 사용자 애플리케이션에 표시되지 않습니다. 그러나 이러한 삭제된 개체의 데이터는 원장 확인 프로세스에 계속 사용할 수 있으며 사용자는 해당 원장 뷰를 통해 기록 데이터를 검사할 수 있습니다. 원장 테이블에서 열을 삭제하면 sys.ledger_column_history에 캡처됩니다. 원장 테이블을 삭제하면 sys.ledger_table_history에 캡처됩니다. 원장 테이블 및 해당 종속 개체를 삭제하면 시스템 카탈로그 뷰에서 삭제된 것으로 표시되고 이름이 변경됩니다.

  • 삭제된 원장 테이블은 sys.tables에서 is_dropped_ledger_table을 설정하여 삭제된 것으로 표시되고 이름이 MSSQL_DroppedLedgerTable_<dropped_ledger_table_name>_<GUID> 형식으로 바뀝니다.
  • 업데이트 가능한 원장 테이블에서 삭제된 기록 테이블은 이름이 MSSQL_DroppedLedgerHistory_<dropped_history_table_name>_<GUID> 형식으로 바뀝니다.
  • 삭제된 원장 뷰는 sys.views에서 is_dropped_ledger_view를 설정하여 삭제된 것으로 표시되고 이름이 MSSQL_DroppedLedgerView_<dropped_ledger_view_name>_<GUID> 형식으로 바뀝니다.

참고 항목

이름이 바뀐 테이블 또는 뷰의 길이가 128자를 초과하면 삭제된 원장 테이블, 기록 테이블 및 원장 보기의 이름이 잘려질 수 있습니다.

열 변경

원장 테이블의 기본 데이터에 영향을 주지 않는 변경 내용은 원장에 캡처되는 해시에 영향을 주지 않으므로 특별한 처리 없이 지원됩니다. 이러한 변경 내용은 다음과 같습니다.

  • Null 허용 여부 변경
  • 유니코드 문자열에 대한 데이터 정렬
  • 가변 길이 열의 길이

그러나 데이터 형식 변경과 같이 기존 데이터의 형식에 영향을 줄 수 있는 작업은 지원되지 않습니다.