다음을 통해 공유


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

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

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

업데이트 가능 원장 테이블과 임시 테이블은 둘 다 시스템 버전 테이블이며, 데이터베이스 엔진은 두 테이블에 대한 기록 행 버전을 보조 기록 테이블에 캡처합니다. 두 기술은 각각 고유한 이점을 제공합니다. 업데이트 가능 원장 테이블로 현재 및 기록 데이터 변조를 모두 명확히 알 수 있습니다. temporal 테이블은 현재 시점에 올바른 데이터뿐만 아니라 어느 시점에 저장된 데이터든 쿼리할 수 있도록 지원합니다. 업데이트 가능 원장 테이블인 동시에 temporal 테이블인 테이블을 만들어 두 기술을 함께 사용할 수 있습니다.

원장 테이블 아키텍처를 보여 주는 다이어그램.

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 트랜잭션 내에서 행 버전을 삭제한 작업의 시퀀스 번호입니다.

기록 테이블

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

업데이트 가능 원장 테이블을 만들 때 기록 테이블을 포함할 스키마의 이름과 기록 테이블의 이름을 지정할 수도 있고, 기록 테이블의 이름이 시스템에서 생성되면 이를 원장 테이블과 동일한 스키마에 추가할 수도 있습니다. 시스템에서 생성된 이름을 가진 기록 테이블을 익명 기록 테이블이라고 합니다. 익명 기록 테이블의 명명 규칙은 <schema>.<updatableledgertablename>.MSSQL_LedgerHistoryFor_<GUID>입니다.

원장 보기

모든 업데이트 가능 원장 테이블에 대해, 시스템에서 원장 보기라는 보기가 자동으로 생성됩니다. 원장 보기는 업데이트 가능한 원장 테이블과 관련 기록 테이블의 조인입니다. 원장 보기는 기록 데이터를 기록 테이블에 조인하여 업데이트 가능한 원장 테이블에서 발생한 모든 행 수정 사항을 보고합니다. 이 보기를 사용하면 사용자, 파트너 또는 감사자가 모든 과거 작업을 분석하고 잠재적인 변조를 감지할 수 있습니다. 각 행 작업에는 작업이 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를 포함합니다. 자세한 내용은 이전 행을 참조하세요.