업데이트할 수 있는 원장 테이블 만들기 및 사용
적용 대상: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance
이 문서에서는 업데이트 가능한 원장 테이블을 만드는 방법을 보여줍니다. 다음으로 업데이트 가능한 원장 테이블에 값을 삽입한 다음 데이터를 업데이트합니다. 마지막으로 원장 보기를 사용하여 결과를 볼 수 있습니다. 은행 고객의 계좌 잔액을 추적하는 은행 애플리케이션의 예를 사용합니다. 이 예제에서는 업데이트 가능한 원장 테이블과 해당 기록 테이블 및 원장 보기 간의 관계를 실용적으로 살펴봅니다.
필수 조건
업데이트 가능한 원장 테이블 만들기
다음 스키마를 사용하여 계정 잔액 테이블을 만듭니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
CustomerID | int | 고객 ID - 클러스터형 기본 키 |
LastName | varchar (50) | 고객 성 |
FirstName | varchar (50) | 고객 이름 |
Balance | 소수점(10,2) | 계정 잔액 |
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
인수 지정은 선택 사항입니다.업데이트 가능한 원장 테이블이 만들어지면 해당 기록 테이블과 원장 보기도 만들어집니다. 다음 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';
개시 잔액이 50달러인 신규 고객으로 이름
Nick Jones
를 삽입합니다.INSERT INTO [Account].[Balance] VALUES (1, 'Jones', 'Nick', 50);
개시 잔액이 각각 500달러, 30달러 및 200달러인 신규 고객으로
John Smith
,Joe Smith
및Mary Michaels
이름을 삽입합니다.INSERT INTO [Account].[Balance] VALUES (2, 'Smith', 'John', 500), (3, 'Smith', 'Joe', 30), (4, 'Michaels', 'Mary', 200);
[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
,Joe
및Mary
는 동일한 트랜잭션을 사용하여 삽입되었으므로 동일한 트랜잭션 ID를 공유합니다.ledger_start_sequence_number
열은 트랜잭션에 의해 값이 삽입된 순서를 기록합니다.
Nick
의 잔액을50
에서100
으로 업데이트합니다.UPDATE [Account].[Balance] SET [Balance] = 100 WHERE [CustomerID] = 1;
[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
에 대한 새 잔액을 보여줍니다.
사용 권한
변경 가능한 원장 테이블을 만들려면 권한이 필요합니다 ENABLE LEDGER
. 원장 테이블과 관련된 권한에 대한 자세한 내용은 사용 권한을 참조 하세요.
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기