업데이트 가능한 원장 테이블

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

업데이트 가능한 원장 테이블은 사용자가 변조 방지 기능을 제공하면서 업데이트 및 삭제를 수행할 수 있는 시스템 버전 테이블입니다. 업데이트 또는 삭제가 발생하면 행의 모든 이전 버전이 기록 테이블이라고 하는 보조 테이블에 유지됩니다. 기록 테이블은 업데이트 가능 원장 테이블의 스키마를 미러링합니다. 행이 업데이트되면 행의 최신 버전은 원장 테이블에 남아 있고, 이전 버전은 시스템에 의해 애플리케이션과 투명하게 기록 테이블에 삽입됩니다.

업데이트 가능 원장 테이블과 임시 테이블은 둘 다 시스템 버전 테이블이며, 데이터베이스 엔진은 두 테이블에 대한 기록 행 버전을 보조 기록 테이블에 캡처합니다. 두 기술은 각각 고유한 이점을 제공합니다. 업데이트 가능한 원장 테이블은 현재 및 기록 데이터 변조를 모두 명확하게 합니다. 임시 테이블은 현재 시점에 올바른 데이터만 사용하는 대신 특정 시점에 저장된 데이터를 쿼리할 수 있도록 지원합니다. 두 기술을 함께 사용하면 업다이트 가능한 원장 테이블과 임시 테이블이 모두 있는 테이블을 만들 수 있습니다.

Diagram that shows ledger table architecture.

CREATE DATABASE(Transact-SQL) 문에 LEDGER = ON 인수를 지정하여 변경 가능한 원장 테이블을 만들 수 있습니다.

LEDGER = ON는 원장 데이터베이스에서 업그레이드 가능한 원장 테이블을 만들 때 선택 사항입니다. 기본적으로 각 테이블은 원장 데이터베이스의 업그레이드 가능한 원장 테이블입니다.

T-SQL 문에서 인수를 LEDGER 지정할 때 사용할 수 있는 옵션에 대한 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하세요.

Important

원장 테이블을 만든 후에는 원장 테이블이 아닌 테이블에 되돌리기 수 없습니다. 따라서 공격자는 원장 테이블에서 원장 기능을 일시적으로 제거하고 변경한 다음 원장 기능을 다시 활성화할 수 없습니다.

업데이트 가능한 원장 테이블 스키마

업데이트 가능한 원장 테이블에는 테이블에 변경한 트랜잭션과 트랜잭션에 의해 행이 업데이트된 작업 순서를 나타내는 메타데이터가 포함된 다음 GENERATED ALWAYS 열이 있어야 합니다. 이 데이터는 시간이 지남에 따라 데이터가 삽입되는 방식을 이해하는 포렌식 용도에 유용합니다.

CREATE TABLE(Transact-SQL) 문에서 원장 테이블 및 원장 기록 테이블의 필수 GENERATED ALWAYS 열을 지정하지 않으면 시스템에서 자동으로 열을 추가하고, 이 열은 다음 기본 이름을 사용합니다. 자세한 내용은 변경 가능한 원장 테이블 만들기의 예제 를 참조하세요.

기본 열 이름 데이터 형식 설명
ledger_start_transaction_id bigint 행 버전을 만든 트랜잭션의 ID입니다.
ledger_end_transaction_id bigint 행 버전을 삭제한 트랜잭션의 ID입니다.
ledger_start_sequence_number bigint 행 버전을 만든 트랜잭션 내 작업의 시퀀스 번호
ledger_end_sequence_number bigint 트랜잭션 내에서 행 버전을 삭제한 작업의 시퀀스 번호입니다.

기록 테이블

기록 테이블은 업데이트 가능한 원장 테이블을 만들 때 자동으로 만들어집니다. 기록 테이블은 업데이트 가능한 원장 테이블의 업데이트 및 삭제로 인해 변경된 행의 기록 값을 캡처합니다. 기록 테이블의 스키마는 연결된 업다이트 가능한 원장 테이블의 스키마를 미러.

변경 가능한 원장 테이블을 만들 때 기록 테이블과 기록 테이블을 포함할 스키마의 이름을 지정하거나 시스템에서 기록 테이블의 이름을 생성하고 원장 테이블과 동일한 스키마에 추가할 수 있습니다. 시스템 생성 이름을 가진 기록 테이블을 익명 기록 테이블이라고 합니다. 익명 기록 테이블에 대한 명명 규칙은 .<updatableledgertablename>입니다<schema>. <GUID>MSSQL_LedgerHistoryFor_.

원장 보기

모든 변경 가능한 원장 테이블에 대해 시스템은 원장 보기라는 뷰를 자동으로 생성합니다. 원장 보기는 업데이트 가능한 원장 테이블과 관련 기록 테이블의 조인입니다. 원장 보기는 기록 데이터를 기록 테이블에 조인하여 업데이트 가능한 원장 테이블에서 발생한 모든 행 수정 사항을 보고합니다. 이 보기를 사용하면 사용자, 파트너 또는 감사자가 모든 기록 작업을 분석하고 잠재적인 변조를 검색할 수 있습니다. 각 행 작업에는 작업이 DELETE인지 아니면 INSERT인지 여부와 함께 작동 트랜잭션의 ID가 제공됩니다. 사용자는 트랜잭션이 실행된 시간과 트랜잭션을 실행한 사용자의 ID에 대한 자세한 정보를 검색하여 이 트랜잭션에서 수행하는 다른 작업과 상호 연결할 수 있습니다.

예를 들어 은행 시나리오의 거래 기록을 추적하려는 경우 원장 보기는 시간에 따른 트랜잭션의 연대기를 제공합니다. 원장 보기를 사용하면 변경 가능한 원장 테이블과 기록 테이블을 독립적으로 보거나 고유한 보기를 생성할 필요가 없습니다.

원장 보기를 사용하는 예제는 변경 가능한 원장 테이블 만들기 및 사용을 참조 하세요.

원장 뷰의 스키마는 미러 변경 가능한 원장 및 기록 테이블에 정의된 열을 표시하지만 GENERATED ALWAYS 열은 변경 가능한 원장 및 기록 테이블의 열과 다릅니다.

원장 보기 스키마

참고 항목

CREATE TABLE(Transact-SQL) 문과 함께 매개 변수를 사용하여 <ledger_view_option> 테이블을 만들 때 원장 보기 열 이름을 사용자 지정할 수 있습니다. 자세한 내용은 원장 보기 옵션 및 CREATE TABLE(Transact-SQL)해당 예제를 참조하세요.

기본 열 이름 데이터 형식 설명
ledger_transaction_id bigint 행 버전을 만들거나 삭제한 트랜잭션의 ID입니다.
ledger_sequence_number bigint 테이블의 트랜잭션 내에서 행 수준 작업의 시퀀스 번호입니다.
ledger_operation_type tinyint 1 포함(INSERT) 또는 2 (DELETE). 원장 테이블에 행을 삽입하면 이 열에 포함된 원장 보기에 새 행이 생성됩니다 1 . 원장 테이블에서 행을 삭제하면 이 열에 포함된 원장 보기에 새 행이 생성됩니다 2 . 원장 테이블에서 행을 업데이트하면 원장 보기에 2개의 새 행이 생성됩니다. 이 열에서 한 행에는 2(DELETE)이 포함되고 다른 행에는 1(INSERT)이 포함됩니다.
ledger_operation_type_desc nvarchar(128) INSERT 또는 DELETE를 포함합니다. 자세한 내용은 이전 행을 참조하세요.