ledger 테이블 생성, 변경 이력 조회, 무결성 검증
SQL Server보안명령어
USE [Musteri];
-- Ledger verification requires snapshot isolation:
ALTER DATABASE [Musteri] SET ALLOW_SNAPSHOT_ISOLATION ON;
-- Updatable ledger table (history table maintained automatically):
CREATE TABLE dbo.Hesap (
HesapId int NOT NULL PRIMARY KEY,
Bakiye decimal(18,2) NOT NULL
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Hesap_History), LEDGER = ON);
-- Append-only ledger (UPDATE/DELETE are blocked):
CREATE TABLE dbo.IslemLog (Id bigint IDENTITY, Mesaj nvarchar(400))
WITH (LEDGER = ON (APPEND_ONLY = ON));
-- Who changed what, and when:
SELECT t.commit_time, t.principal_name, l.HesapId, l.Bakiye, l.ledger_operation_type_desc
FROM dbo.Hesap_Ledger l
JOIN sys.database_ledger_transactions t ON t.transaction_id = l.ledger_transaction_id
ORDER BY t.commit_time DESC;
-- Take a digest (store it somewhere trusted outside) and verify:
EXEC sys.sp_generate_database_ledger_digest;
EXEC sys.sp_verify_database_ledger
N'{"database_name":"Musteri","block_id":0,"hash":"0x...","last_transaction_commit_time":"...","digest_time":"..."}';하는 일
행 변경을 암호화 해시 체인에 기록하는 ledger 테이블을 생성한다. _Ledger 뷰는 각 INSERT/UPDATE/DELETE를 누가 언제 했는지 보여 주며, 저장된 digest로 검증하면 데이터가 사후에(DBA를 포함해) 변경되지 않았음을 증명할 수 있다.
사용 시점
불변성을 증명해야 하는 데이터: 금융 기록, 감사 추적, 계약/승인 기록.
주의
ledger는 테이블 생성 후 끌 수 없다. ledger 테이블은 일반 테이블로 변환할 수 없으며, 삭제된 ledger 테이블은 dropped ledger table로 보존된다. updatable ledger는 변경마다 이력 행을 기록하므로 저장 공간이 늘어난다. digest를 데이터베이스 밖의 불변 스토리지(WORM, Azure immutable blob)에 저장하지 않으면 검증은 증거 가치가 없다. sp_verify_database_ledger는 snapshot isolation 없이 37498 오류로 실패한다.