업데이트할 수 있는 원장 테이블 만들기 및 사용

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

이 문서에서는 업데이트 가능한 원장 테이블을 만드는 방법을 보여줍니다. 다음으로 업데이트 가능한 원장 테이블에 값을 삽입한 다음 데이터를 업데이트합니다. 마지막으로 원장 보기를 사용하여 결과를 볼 수 있습니다. 은행 고객의 계좌 잔액을 추적하는 은행 애플리케이션의 예를 사용합니다. 이 예제에서는 업데이트 가능한 원장 테이블과 해당 기록 테이블 및 원장 보기 간의 관계를 실용적으로 살펴봅니다.

필수 조건

업데이트 가능한 원장 테이블 만들기

다음 스키마를 사용하여 계정 잔액 테이블을 만듭니다.

열 이름 데이터 형식 설명
CustomerID int 고객 ID - 클러스터형 기본 키
LastName varchar (50) 고객 성
FirstName varchar (50) 고객 이름
Balance 소수점(10,2) 계정 잔액
  1. SQL Server Management Studio 또는 Azure Data Studio를 사용하여 [Account].[Balance]라는 새 스키마와 테이블을 만듭니다.

    CREATE SCHEMA [Account];
    GO  
    CREATE TABLE [Account].[Balance]
    (
        [CustomerID] INT NOT NULL PRIMARY KEY CLUSTERED,
        [LastName] VARCHAR (50) NOT NULL,
        [FirstName] VARCHAR (50) NOT NULL,
        [Balance] DECIMAL (10,2) NOT NULL
    )
    WITH 
    (
     SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Account].[BalanceHistory]),
     LEDGER = ON
    );
    

    참고 항목

    데이터베이스를 만들 때 원장 데이터베이스를 사용하도록 설정한 경우 LEDGER = ON 인수 지정은 선택 사항입니다.

  2. 업데이트 가능한 원장 테이블이 만들어지면 해당 기록 테이블과 원장 보기도 만들어집니다. 다음 T-SQL 명령을 실행하여 새 테이블과 새 뷰를 확인합니다.

    SELECT 
    ts.[name] + '.' + t.[name] AS [ledger_table_name]
    , hs.[name] + '.' + h.[name] AS [history_table_name]
    , vs.[name] + '.' + v.[name] AS [ledger_view_name]
    FROM sys.tables AS t
    JOIN sys.tables AS h ON (h.[object_id] = t.[history_table_id])
    JOIN sys.views v ON (v.[object_id] = t.[ledger_view_id])
    JOIN sys.schemas ts ON (ts.[schema_id] = t.[schema_id])
    JOIN sys.schemas hs ON (hs.[schema_id] = h.[schema_id])
    JOIN sys.schemas vs ON (vs.[schema_id] = v.[schema_id])
    WHERE t.[name] = 'Balance';
    

    Screenshot that shows querying new ledger tables.

  3. 개시 잔액이 50달러인 신규 고객으로 이름 Nick Jones를 삽입합니다.

    INSERT INTO [Account].[Balance]
    VALUES (1, 'Jones', 'Nick', 50);
    
  4. 개시 잔액이 각각 500달러, 30달러 및 200달러인 신규 고객으로 John Smith, Joe SmithMary Michaels 이름을 삽입합니다.

    INSERT INTO [Account].[Balance]
    VALUES (2, 'Smith', 'John', 500),
    (3, 'Smith', 'Joe', 30),
    (4, 'Michaels', 'Mary', 200);
    
  5. [Account].[Balance]라는 업데이트 가능한 원장 테이블을 보고 테이블에 추가된 GENERATED ALWAYS 열을 지정합니다.

    SELECT [CustomerID]
       ,[LastName]
       ,[FirstName]
       ,[Balance]
       ,[ledger_start_transaction_id]
       ,[ledger_end_transaction_id]
       ,[ledger_start_sequence_number]
       ,[ledger_end_sequence_number]
     FROM [Account].[Balance];  
    

    결과 창에는 T-SQL 명령에 의해 삽입된 값과 데이터 계보 용도로 사용되는 시스템 메타데이터가 차례로 표시됩니다.

    • ledger_start_transaction_id 열은 데이터를 삽입한 트랜잭션과 연결된 고유한 트랜잭션 ID를 기록합니다. John, JoeMary는 동일한 트랜잭션을 사용하여 삽입되었으므로 동일한 트랜잭션 ID를 공유합니다.

    • ledger_start_sequence_number 열은 트랜잭션에 의해 값이 삽입된 순서를 기록합니다.

      Screenshot that shows ledger table example 1.

  6. Nick의 잔액을 50에서 100으로 업데이트합니다.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. [Account].[Balance] 원장 보기를 트랜잭션 원장 시스템 뷰와 함께 확인하여 변경을 수행한 사용자를 식별합니다.

     SELECT
     t.[commit_time] AS [CommitTime] 
     , t.[principal_name] AS [UserName]
     , l.[CustomerID]
     , l.[LastName]
     , l.[FirstName]
     , l.[Balance]
     , l.[ledger_operation_type_desc] AS Operation
     FROM [Account].[Balance_Ledger] l
     JOIN sys.database_ledger_transactions t
     ON t.transaction_id = l.ledger_transaction_id
     ORDER BY t.commit_time DESC;
    

    기록 테이블이 아니라 원장 보기를 통해 변경 기록을 쿼리하는 것이 좋습니다.

    업데이트 가능한 원장 테이블에서 Nick의 계좌 잔액이 100으로 업데이트되었습니다.
    원장 보기는 원장 테이블을 업데이트하는 것이 DELETE를 포함하는 원래 행의 50임을 보여줍니다. 100이 있는 새 행의 해당 INSERT가 있는 잔액은 Nick에 대한 새 잔액을 보여줍니다.

    Screenshot that shows ledger table example 3.

사용 권한

변경 가능한 원장 테이블을 만들려면 권한이 필요합니다 ENABLE LEDGER . 원장 테이블과 관련된 권한에 대한 자세한 내용은 사용 권한을 참조 하세요.