특정 시점에 테이블의 데이터 값을 반환하는 테이블은 첫 번째 관계형 데이터베이스 이후로 우리와 함께 해왔지만 항상 특별한 쿼리와 제약 조건이 필요했고 제대로하기가 까다로울 수 있습니다. SQL Server 2016의 새로운 기능인 시스템 버전 임시 테이블은 이러한 테이블이 다른 테이블처럼 작동하도록합니다. 테이블을 생성하거나 기존 테이블을 수정하는 방법은 무엇입니까? 메모리 내 최적화 된 OLTP 테이블을 임시로 만들려면 어떻게해야합니까? Alex Grinberg가 방법을 보여줍니다.
임시 또는 시스템 버전 테이블은 SQL Server 2016의 데이터베이스 기능으로 도입되었습니다.이를 통해 현재 데이터가 아닌 지정된 시간에 저장된 데이터에 대한 정보를 제공 할 수있는 테이블 유형이 제공됩니다. ANSI SQL 2011은 먼저 임시 테이블을 데이터베이스 기능으로 지정했으며 이제 SQL Server에서 지원됩니다.
임시 테이블의 가장 일반적인 비즈니스 용도는 다음과 같습니다.
- 천천히 변화하는 치수. 시간 테이블은 데이터웨어 하우징 데이터베이스에서 잘 알려진 문제인 시간 분할 데이터와 같이 지정된 기간 동안 최신 데이터를 쿼리하는 더 간단한 방법을 제공합니다.
- 데이터 감사. 임시 테이블은 "상위"테이블에서 데이터가 수정 된시기를 결정하는 감사 추적을 제공합니다. 이를 통해 규정 준수 요구 사항을 충족하고 시간에 따른 데이터 변경 사항을 추적 및 감사하여 필요할 때 데이터 포렌식을 수행 하는 데 도움이됩니다 .
- 레코드 수준 손상 복구 또는 복구 . 레코드가 실수로 삭제되거나 업데이트 된 경우 다운 타임없이 테이블 행의 데이터 변경을 '실행 취소'하는 방법을 설정합니다. 따라서 이전 버전의 데이터를 히스토리 테이블에서 검색하여 '상위'테이블에 다시 삽입 할 수 있습니다. – 이는 누군가 (또는 일부 애플리케이션 오류로 인해) 실수로 데이터를 삭제하고 사용자가 데이터를 되돌 리거나 복구하려고 할 때 도움이됩니다.
- 문서 발행일에 대한 정확한 데이터로 재무 보고서, 송장 및 명세서 를 복제 합니다. 임시 테이블을 사용하면 특정 시점의 데이터를 쿼리하여 당시의 데이터 상태를 조사 할 수 있습니다.
- 진행중인 비즈니스 활동에서 데이터가 시간에 따라 어떻게 변하는 지 이해하여 추세 를 분석하고 시간에 따라 데이터가 변하는 방식의 추세를 계산합니다.
SQL Server 2016이 도입되기 전 어두운 날에는 데이터 로깅 메커니즘이 트리거에서 명시 적으로 설정되어야했습니다. 간단한 예제를 제공하려면 Department 테이블 자체부터 시작하여 다음 구조로 Department 테이블 에 대한 기록 유지 관리를 자동화해야 합니다.
CREATE TABLE dbo.Department ( DeptID INT NOT NULL, DeptName VARCHAR(50) NOT NULL, ManagerID INT NULL, ParentDeptID INT NULL, Created DATETIME NOT NULL CONSTRAINT DF_Department_Created DEFAULT GETDATE(), CONSTRAINT PK_Department_DeptID PRIMARY KEY CLUSTERED(DeptID ASC) ON [PRIMARY] ) ON [PRIMARY]; GO |
다음 단계는 변경 내역을 제공하는 두 개의 추가 열이 있는 Department_Log 테이블 을 만드는 것입니다.
- LogDate
- LogAction
CREATE TABLE dbo.Department_Log ( DeptID INT NOT NULL, DeptName VARCHAR(50) NOT NULL, ManagerID INT NULL, ParentDeptID INT NULL, Created DATETIME NOT NULL, LogDate DATETIME NOT NULL, LogAction VARCHAR(10) NOT NULL ) ON [PRIMARY]; GO |
로깅 '히스토리'테이블이 준비되면 UPDATE 및 DELETE 작업에 대한 변경 사항을 기록하는 트리거를 만들 수 있습니다.
CREATE TRIGGER dbo.tr_Department_Log ON dbo.Department FOR UPDATE, DELETE AS BEGIN SET NOCOUNT ON; IF (SELECT COUNT(1) FROM inserted JOIN deleted ON Inserted.DeptID = Deleted.DeptID ) > 0 BEGIN INSERT dbo.Department_Log (DeptID, DeptName, ManagerID, ParentDeptID, Created, LogDate, LogAction) SELECT Deleted.DeptID, Deleted.DeptName, Deleted.ManagerID, Deleted.ParentDeptID, Deleted.Created, GETDATE(), 'UPDATED' FROM deleted; END; ELSE BEGIN INSERT dbo.Department_Log (DeptID, DeptName, ManagerID, ParentDeptID, Created, LogDate, LogAction) SELECT Deleted.DeptID, Deleted.DeptName, Deleted.ManagerID, Deleted.ParentDeptID, Deleted.Created, GETDATE(), 'DELETED' FROM deleted; END; SET NOCOUNT OFF; END; GO |
Department_Log 테이블이 트리거와 함께 작동 하는 방식을 보여주기 위해 DeptID = 1 인 행을 세 번 업데이트 한 다음이 행을 삭제하고 마지막으로 마지막 업데이트에서 DeptName 열을 원래 값으로 설정했습니다.
update dbo.Department SET DeptName = '' where DeptID = 1
update dbo.Department SET DeptName = 'Engineering IT' where DeptID = 1
update dbo.Department SET DeptName = 'Engineering WEB' where DeptID = 1
DELETE dbo.Department where DeptID = 1
INSERT dbo.Department(DeptID, DeptName) SELECT DeptID,DeptName FROM Department_Log WHERE DeptID = 1 and LogAction = 'DELETED'
update dbo.Department SET DeptName = 'Engineering' where DeptID = 1
select DeptID, DeptName,Created,LogDate,LogAction from Department_Log |
다음 그림에 표시된 Department_Log 테이블의 결과 :
SQL Server 2016의 임시 테이블 기능은 로깅 메커니즘을 크게 단순화 할 수 있습니다. 이 문서에서는 시스템 버전 테이블을 작성하는 방법에 대한 단계별 지침을 제공합니다.
테이블을 임시 테이블로 마이그레이션하기 위해 기존 테이블에 임시 테이블 옵션을 설정할 수 있습니다. 새 임시 테이블을 생성하려면 임시 테이블 옵션을 ON으로 설정하기 만하면됩니다 (예 : SYSTEM_VERSIONING = ON). 임시 테이블 옵션이 활성화되면 SQL Server 2016은 "기록"테이블을 자동으로 생성하고 내부적으로 상위 및 기록 테이블을 모두 유지합니다. 하나는 실제 데이터를 저장하고 다른 하나는 기록 데이터를 저장합니다. 시간 테이블의 SYSTEM_TIME 기간 열 (예 : SysStartTime 및 SysEndTime)을 사용하면 메커니즘이 다른 시간 조각에 대한 데이터를보다 효율적으로 쿼리 할 수 있습니다. 업데이트되거나 삭제 된 데이터는 "기록"테이블로 이동하는 반면 "상위"테이블은 업데이트 된 레코드에 대한 최신 행 버전을 유지합니다.
캐치는 무엇입니까?
임시 테이블의 가장 중요한 고려 사항, 제한 사항 및 제한 사항은 다음과 같습니다.
- 임시 테이블과 히스토리 테이블 사이에 레코드를 연결하려면 임시 테이블에 기본 키가 있어야합니다. 그러나 히스토리 테이블은 기본 키를 가질 수 없습니다.
- DATETIME2의 데이터 형식은 (예를 들어 SYSTEM_TIME 기간 열의 설정해야 SysStartTime 및 SysEndTime ).
- 히스토리 테이블을 생성 할 때 항상 히스토리 테이블에서 임시 테이블의 스키마와 테이블 이름을 모두 지정해야합니다.
- PAGE 압축은 히스토리 테이블의 기본 설정입니다.
- 임시 테이블은 스토리지 비용에 영향을 미치고 성능 문제가있을 수있는 blob 데이터 유형 (nvarchar (max), varchar (max), varbinary (max), ntext, text 및 image)을 지원합니다.
- 시간 테이블과 히스토리 테이블은 모두 동일한 데이터베이스에 생성되어야합니다. 링크 된 서버를 사용하여 임시 테이블을 제공 할 수 없습니다.
- 히스토리 테이블에는 제약 조건, 기본 키, 외래 키 또는 열 제약 조건을 사용할 수 없습니다.
- FOR SYSTEM_TIME 절을 사용하는 쿼리가있는 인덱싱 된 뷰에서 임시 테이블을 참조 할 수 없습니다.
- SYSTEM_TIME 기간 열은 INSERT 및 UPDATE 문에서 직접 참조 할 수 없습니다.
- SYSTEM_VERSIONING이 ON 인 동안에는 TRUNCATE TABLE을 사용할 수 없습니다.
- 히스토리 테이블의 데이터를 직접 수정할 수 없습니다.
전체 고려 사항 및 제한 사항 목록은 온라인 설명서를 참조 하십시오.
임시 테이블 생성
Listing 1의 하나의 DDL 스크립트에서 임시 및 히스토리 테이블을 생성하는 방법을 설명했습니다. 앞서 언급했듯이, 두 열 모두에 대해 데이터 유형이 datetime2 인 SysStartTime 및 SysEndTime 열은 임시 테이블에 필요합니다. SysStartTime 컬럼 은 GENERATED ALWAYS AS ROW START NOT NULL 스펙 이어야 하며 SysEndTime 은 GENERATED ALWAYS AS ROW END NOT NULL 이어야 합니다 . 해당 열에 대한 기본값을 제공 할 의무는 없지만 권장합니다. SysStartTime 및 SysEndTime 열은 모두 PERIOD FOR SYSTEM_TIME 열에 지정되어야합니다 (MSDN이 PERIOD를 정의한대로 다른 발행물 PERIOD calls 절).
참고 : 시스템 버전 열의 이름을 SysStartTime 및 SysEndTime 으로 지정할 필요는 없지만 시간 캡처 기능을 반영하도록 열 이름을 선택해야합니다. GENERATED ALWAYS AS ROW START / END 및 PERIOD FOR SYSTEM_TIME (nameFrom, nameTo) 옵션은 임시 테이블 기능을 활성화합니다.
CREATE TABLE Department ( DeptID INT NOT NULL PRIMARY KEY CLUSTERED, DeptName VARCHAR(50) NOT NULL, ManagerID INT NULL, ParentDeptID INT NULL, SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START CONSTRAINT DF_Department_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL, SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END CONSTRAINT DF_Department_SysEndTime DEFAULT CONVERT( DATETIME2, '9999-12-31 23:59:59' ) NOT NULL, PERIOD FOR SYSTEM_TIME(SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory)); |
목록 1 : 시간 및 히스토리 테이블 작성
임시 테이블이 생성되면 밑줄이 그어진 히스토리 테이블이 자동으로 생성되고 (그림 1), 히스토리에 대해 SysStartTime 및 SysEndTime (또는 시스템 버전 관리를 정의하기 위해 선택한 이름) 열이 있는 CLUSTERED INDEX 가 생성됩니다. 표, 목록 2.
CREATE CLUSTERED INDEX ix_DepartmentHistory ON dbo.DepartmentHistory (SysStartTime ASC, SysEndTime ASC ) ON [PRIMARY]; |
목록 2 : 클러스터형 인덱스 생성
임시 테이블에 새 열을 추가해야하는 경우 ALTER TABLE… ADD 열 DDL을 허용해야하며 새 열은 히스토리 테이블에서 자동으로 미러링됩니다.
그림 1 : 개체 탐색기에서 새로 생성 된 시간 및 기록 테이블 표시.
그러나 임시 테이블에는 DROP TABLE DDL을 사용할 수 없습니다. 먼저 SYSTEM_VERSIONING을 꺼야합니다.
ALTER TABLE Department SET (SYSTEM_VERSIONING = OFF); |
목록 3 : 부서 테이블에서 SYSTEM_VERSIONING 비활성화.
SYSTEM_VERSIONING이 OFF로 설정되면 임시 테이블과 히스토리 테이블이 모두 일반 테이블이됩니다. 그런 다음 DROP TABLE 명령을 해당 테이블에 사용할 수 있습니다.
기존 테이블을 시스템 버전 테이블로 설정
SQL Server를 사용하면 기존 테이블을 임시 테이블로 변환 할 수 있습니다. 이 작업을 수행하려면 테이블에 기본 키가 있는지 확인하고 아직 존재하지 않는 경우 새로 만들어야합니다. 그런 다음 테이블은 두 개의 datetime2 데이터 유형 열로 변경되어야하며 GENERATED ALWAYS AS ROW START / END 옵션도…
PERIOD FOR SYSTEM_TIME (nameFrom, nameTo) 과 함께 적용 되어야합니다.
두 옵션 모두 ALTER 명령으로 완료해야합니다. 두 번째 ALTER 명령은 SYSTEM_VERSIONING 속성을 활성화하고 선택적으로 (명시 적으로 제공하는 것이 좋습니다) HISTORY_TABLE 속성의 이름을 제공합니다 (Listing 4).
예를 들어 기존 테이블 Department_Exist 를 임시 테이블로 설정해 보겠습니다 . 목록 4를 실행 한 다음 목록 5를 실행하십시오. 그림 2와 같이 테이블 아이콘을 새로 고쳐 결과를 확인하십시오.
CREATE TABLE Department_Exist ( DeptID int NOT NULL PRIMARY KEY CLUSTERED , DeptName varchar(50) NOT NULL , ManagerID INT NULL , ParentDeptID int NULL ) |
목록 4 : Department_Exist 테이블 생성.
ALTER TABLE dbo.Department_Exist ADD SysStartTime datetime2 GENERATED ALWAYS AS ROW START CONSTRAINT DF_Department_Exist_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END CONSTRAINT DF_Department_Exist_SysEndTime DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59') NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) GO
ALTER TABLE dbo.Department_Exist SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Department_ExistHistory)) GO |
목록 5 : 시스템 버전 열을 추가하고 Department_Exist 테이블 에서 시스템 버전을 활성화 합니다.
기존 테이블
시간 테이블로 변환
그림 2 : Temporal 테이블로 변환 한 후 Department_Exist 를 나란히 비교 합니다.
임시 테이블의 메타 데이터를 확인하십시오.
-- List temporal tables, temporal_type = 2 SELECT tables.object_id, temporal_type, temporal_type_desc, history_table_id, tables.name FROM sys.tables WHERE temporal_type = 2 -- SYSTEM_VERSIONED_TEMPORAL_TABLE -- List temporal tables and history tables SELECT h.name temporal_name, h.temporal_type_desc, h.temporal_type, t.name AS history_table_name, t.temporal_type, t.temporal_type_desc FROM sys.tables t JOIN sys.tables h ON t.object_id = h.history_table_id |
메모리 내 최적화 된 OLTP 테이블을 시스템 버전 테이블로 변환
In-Memory Optimized OLTP 테이블을 시스템 버전 테이블 로 변환하는 프로세스 는 비슷하지만이 섹션에서 다루고 설명해야 할 몇 가지 차이점이 있습니다.
인 메모리 최적화 테이블을 시스템 버전 테이블로 변환 할 때 몇 가지 특정 세부 정보를 알고 있어야합니다.
- 인 메모리 최적화 테이블은 내구성이 있어야합니다 (DURABILITY = SCHEMA_AND_DATA).
- In-Memory 최적화 된 히스토리 테이블은 디스크 기반으로 생성됩니다.
- 부모 테이블에만 영향을 미치는 쿼리는 기본적으로 컴파일 된 T-SQL 모듈에서 사용할 수 있습니다. 고유하게 컴파일 된 모듈에서 FOR SYSTEM TIME 절을 사용하여 임시 쿼리를 사용할 수 없지만 임시 쿼리 및 비원시 모듈에서 메모리 내 최적화 된 테이블과 함께 FOR SYSTEM TIME 절을 사용할 수 있습니다.
- SYSTEM_VERSIONING = ON 일 때 메모리 내 최적화 된 상위 테이블에 대한 변경 사항에 대한 가장 최근 변경 사항 (INSERT, DELETE)을 수락하기 위해 내부 메모리 최적화 준비 테이블 이 자동으로 생성됩니다 .
- 내부 메모리 내 최적화 된 준비 테이블의 데이터는 비동기 데이터 플러시 작업에 의해 정기적으로 디스크 기반 기록 테이블로 이동됩니다. 이 데이터 플러시 메커니즘은 내부 메모리 버퍼를 상위 개체의 메모리 사용량의 10 % 미만으로 유지하는 것을 목표로합니다. DMV sys.dm_db_xtp_memory_consumers 는 총 메모리 사용량을 추적하는 데 도움이됩니다.
- 데이터 플러시는 sys.sp_xtp_flush_temporal_history @schema_name, @object_name 저장 프로 시저를 호출하여 적용 할 수 있습니다.
- SYSTEM_VERSIONING = OFF이거나 열을 추가, 삭제 또는 변경하여 시스템 버전 테이블의 스키마를 수정하면 내부 스테이징 버퍼의 전체 내용이 디스크 기반 기록 테이블로 이동됩니다.
- 기록 데이터 쿼리는 효과적으로 SNAPSHOT 격리 수준에서 수행되며 항상 중복없이 메모리 내 스테이징 버퍼와 디스크 기반 테이블 간의 결합을 반환합니다.
- 테이블 스키마를 내부적으로 변경하는 ALTER TABLE 작업은 데이터 플러시를 수행해야하므로 작업 속도가 느려질 수 있습니다.
시스템 버전 테이블 옵션이 활성화 된 상태에서 새 메모리 내 최적화 된 OLTP 생성
임시 테이블 옵션을 사용하여 새로운 인 메모리 최적화 테이블을 생성하기위한 DDL은 구문이 기존 디스크 기반 테이블과 매우 유사합니다. 메모리 내 최적화 된 테이블 구문에는 처음에 MEMORY_OPTIMIZED 및 DURABILITY 속성을 설정하는 WITH 블록이 있습니다. 따라서 SYSTEM_VERSIONING 속성은 목록 7과 같이 쉼표로 구분하여 추가해야합니다.
CREATE TABLE dbo.InMemory ( UniqueName varchar(50) NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 131072), City varchar(32) NULL, State_Province varchar(32) NULL, LastModified datetime NOT NULL , SysStartTime datetime2 GENERATED ALWAYS AS ROW START CONSTRAINT DF_InMemory_SysStartTime DEFAULT GETDATE() NOT NULL , SysEndTime datetime2 GENERATED ALWAYS AS ROW END CONSTRAINT DF_InMemory_SysEndTime DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59') NOT NULL , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime) ) WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA, SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.InMemory_History) ) |
목록 7 : 시스템 버전 테이블 옵션이 활성화 된 상태에서 새로운 인 메모리 최적화 OLTP 생성
기존 메모리 내 최적화 된 OLTP 테이블에 시스템 버전 테이블 옵션 추가.
기존의 메모리 내 최적화 된 OLTP 테이블을 시스템 버전 테이블로 변환하는 것이 더 어렵습니다 (Listing 8 참조).
이 메커니즘을 보여주기 위해 테이블을 만들어 보겠습니다.
CREATE TABLE dbo.InMemoryExist ( UniqueName varchar(50) NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT = 131072), City varchar(32) NULL, State_Province varchar(32) NULL ) WITH ( MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA ) |
목록 8 : 새로운 인 메모리 최적화 OLTP 테이블 생성
테이블이 생성되면 Listing 9와 같이 데이터를 테이블에 추가하기 전에 임시 테이블 옵션을 추가해야합니다.
ALTER TABLE dbo.InMemoryExist ADD SysStartTime datetime2 GENERATED ALWAYS AS ROW START CONSTRAINT DF_InMemoryExist_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL, SysEndTime datetime2 GENERATED ALWAYS AS ROW END CONSTRAINT DF_InMemoryExist_SysEndTime DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59') NOT NULL, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) GO
ALTER TABLE dbo.InMemoryExist SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.InMemoryExist_History)) GO |
목록 9 : 임시 테이블 옵션 추가
테이블에 이미 데이터가있는 경우 테이블을 시스템 버전 테이블로 변환하는 프로세스가 더 복잡합니다.
경우 InMemoryExist이 시스템 버전이 옵션을 사용하여 생성 된, 우리는 드롭 할 필요가 InMemoryExist 및 InMemoryExist_History 테이블 :
ALTER TABLE InMemoryExist set (SYSTEM_VERSIONING = OFF) GO DROP TABLE InMemoryExist GO DROP TABLE InMemoryExist_History GO |
테이블을 다시 생성합니다 (이 섹션의 위에 제공된 코드 샘플, 목록 8 사용). 그런 다음 InMemoryExist 테이블에 데이터를 삽입 합니다.
INSERT InMemoryExist select NEWID(),name, type_desc from sys.objects where is_ms_shipped = 0 |
코드를 실행하여 임시 테이블 옵션 (목록 9)을 추가하면 다음 오류가 발생합니다.
Msg 13575, Level 16, State 0, Line 21 ADD PERIOD FOR SYSTEM_TIME failed because table 'database.dbo.InMemoryExist' contains records where end of period is not equal to MAX datetime. Msg 13510, Level 16, State 1, Line 29 |
SYSTEM_TIME 기간이 정의되지 않은 경우 SYSTEM_VERSIONING을 ON으로 설정할 수 없습니다.
이러한 오류를 방지하려면보다 자세한 단계에서 시스템 버전 관리 옵션을 추가해야합니다.
--Step 1. Adding nullable the columns ALTER TABLE dbo.InMemoryExist ADD SysStartTime datetime2 NULL GO ALTER TABLE dbo.InMemoryExist ADD SysEndTime datetime2 NULL GO --Step 2 Adding the default constraints ALTER TABLE InMemoryExist ADD CONSTRAINT DF_InMemoryExist_SysStartTime DEFAULT GETDATE() FOR SysStartTime; GO ALTER TABLE InMemoryExist ADD CONSTRAINT DF_InMemoryExist_SysEndTime DEFAULT CAST('9999-12-31 23:59:59.9999999' AS DATETIME2) FOR SysEndTime; --Step 3 Updating the column UPDATE dbo.InMemoryExist SET SysStartTime = '19000101 00:00:00.0000000' ,SysEndTime = '99991231 23:59:59.9999999' GO --Step 4 Setting NOT NULL to the columns ALTER TABLE dbo.InMemoryExist ALTER COLUMN SysStartTime datetime2 NOT NULL GO ALTER TABLE dbo.InMemoryExist ALTER COLUMN SysEndTime datetime2 NOT NULL GO --Step 5 Adding PERIOD FOR SYSTEM_TIME option ALTER TABLE InMemoryExist ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) GO --Step 6 Setting SYSTEM_VERSIONING property ALTER TABLE InMemoryExist SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.InMemoryExist_History)) GO |
이제 시스템 버전 관리 프로세스에 InMemoryExist 테이블이 활성화됩니다.
DATA_CONSISTENCY_CHECK 속성 지정
기존 데이터에 대한 데이터 일관성 검사를 시행하려면 DATA_CONSISTENCY_CHECK = ON으로 SYSTEM_VERSIONING을 설정해야합니다. 그러나 DATA_CONSISTENCY_CHECK 속성은 현재 . 임시 테이블에 대해 DATA_CONSISTENCY_CHECK를 활성화하기로 결정한 경우 인스턴스에 SQL Server 2016 용 누적 업데이트 1이 있는지 확인합니다.
다음은 기존 테이블에서 DATA_CONSISTENCY_CHECK 속성을 활성화하는 예입니다.
ALTER TABLE InMemoryExist SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.TableName_History, DATA_CONSISTENCY_CHECK = ON)) For a new table, DATA_CONSISTENCY_CHECK property enables after HISTORY_TABLE property separated by a comma. WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON)); |
결론
임시 테이블은 행 버전 프로세스를 자동화하는 데 매우 유용한 SQL Server 2016 기능입니다. 데이터 보관 작업을 단순화하고 데이터웨어 하우스 데이터베이스에 대해 천천히 변화하는 차원을 활용하기위한 실질적인 해결책이 될 수도 있습니다. 새 테이블과 기존 테이블을 설정하는 것이 매우 쉽기 때문에 임시 테이블 기능은 SQL Server 데이터베이스와 함께 구현하기에 좋은 선택입니다.
'Database > SQL Server' 카테고리의 다른 글
free SSMS add-in for effective database performance tracing (0) | 2021.01.20 |
---|---|
Tempdb 최적화 – tempdb 데이터파일 제거하기 (0) | 2020.10.27 |
SQL Server 2016 - Temporal Table (0) | 2020.10.23 |
SQL Server 감사를위한 변경 데이터 캡처 (0) | 2020.10.13 |
SQL Server 변경 추적을 사용하여 SQL Server 감사 생성 (0) | 2020.10.13 |