시스템 버전 임시 테이블의 데이터 수정Modifying Data in a System-Versioned Temporal Table

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

시스템 버전 temporal 테이블의 데이터는 일반 DML 문을 사용하여 수정됩니다. 여기서 한가지 중요한 차이점은 기간 열 데이터를 직접 수정할 수 없다는 것입니다.Data in a system-versioned temporal table is modified using regular DML statements with one important difference: period column data cannot be directly modified. 데이터가 업데이트되면 버전이 부여되며, 업데이트된 각 행의 이전 버전은 기록 테이블에 삽입됩니다.When data is updated, it is versioned, with the previous version of each updated row is inserted into the history table. 데이터가 삭제되는 경우, 논리적으로 삭제되고 행이 현재 테이블에서 기록 테이블로 이동합니다. 영구적으로 삭제되지 않습니다.When data is deleted, the delete is logical, with the row moved into the history table from the current table - it is not permanently deleted.

데이터 삽입Inserting data

새 데이터를 삽입하면, HIDDEN 이(가) 아니면 PERIOD열을 설명해야 합니다.When you insert new data, you need to account for the PERIOD columns if they are not HIDDEN. 시스템 버전 temporal 테이블로 파티션 전환을 사용할 수도 있습니다.You can also use partition switching with system-versioned temporal tables.

표시되는 기간 열을 사용하여 새 데이터 삽입Insert new data with visible period columns

다음과 같이 표시되는 PERIOD 열이 있으면 새 PERIOD 열을 설명하기 위해 INSERT 문을 구성할 수 있습니다.You can construct your INSERT statement when you have visible PERIOD columns as follows to account for the new PERIOD columns:

  • INSERT 문에 열 목록을 지정하면, 이 열에 대한 값이 시스템에서 자동으로 생성되기 때문에 PERIOD 열을 생략할 수 있습니다.If you specify the column list in your INSERT statement, you can omit the PERIOD columns because system will generate values for these columns automatically.

    --Insert with column list and without period columns   
    INSERT INTO [dbo].[Department] ([DeptID] ,[DeptName] ,[ManagerID] ,[ParentDeptID])   
    VALUES(10, 'Marketing', 101, 1);  
    
  • INSERT 문의 열 목록에 PERIOD 열을 지정하면 해당 값으로 DEFAULT 을 지정해야 합니다.If you do specify thePERIOD columns in the column list in your INSERT statement, then you need to specify DEFAULT as their value.

    INSERT INTO [dbo].[Department] ([DeptID] ,[DeptName] ,[ManagerID] ,[ParentDeptID], SysStartTime, SysEndTime)   
    VALUES(11, 'Sales', 101, 1, default, default);  
    
  • INSERT 문에 열 목록을 지정하지 않으면 DEFAULT 또는 PERIOD 열을 지정합니다.If you do not specify the column list in your INSERT statement, specify DEFAULT for PERIOD columns.

    --Insert without  column list and DEFAULT values for period columns   
    INSERT INTO [dbo].[Department]    
    VALUES(12, 'Production', 101, 1, default, default);  
    

HIDDEN 기간 열로 테이블에 데이터 삽입Insert data into a table with HIDDEN period columns

PERIOD 열이 HIDDEN으로 지정되면 열 목록을 지정하지 않고 INSERT를 사용하는 경우에, 표시되는 열의 값만 지정하면 됩니다.If PERIOD columns are specified as HIDDEN, then you need only to specify the values for the visible columns when you use INSERT without specifying the column list. INSERT 문에 새로운 PERIOD 열을 설명할 필요가 없습니다.You do not need to account for the new PERIOD columns in your INSERT statement. 이러한 동작은 버전 관리를 활용하는 테이블에서 시스템 버전 관리를 활성화하는 경우 레거시 응용 프로그램이 계속 작동하도록 보장합니다.This behavior guarantees that your legacy applications will continue to work when you enable system-versioning on tables that will benefit from versioning.

CREATE TABLE [dbo].[CompanyLocation]  
(   
     [LocID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY  
   , [LocName] [varchar](50) NOT NULL  
   , [City] [varchar](50) NOT NULL  
   , [SysStartTime] [datetime2](0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL   
   , [SysEndTime] [datetime2](0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL   
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])   
)    
WITH ( SYSTEM_VERSIONING = ON );   
GO   
INSERT INTO [dbo].[CompanyLocation]   
VALUES  ('Headquarters', 'New York');  

PARTITION SWITCH를 사용하여 데이터 삽입Inserting data using PARTITION SWITCH

현재 테이블이 분할되어 있다면 빈 파티션으로 데이터를 로드하거나 여러 파티션에 병렬로 로드하는 효율적인 메커니즘으로 PARTITION SWITCH를 사용할 수 있습니다.If the current table is partitioned, you can use partition switch as an efficient mechanism to load data into an empty partition or to load into multiple partitions in parallel.
시스템 버전 temporal 테이블과 함께 PARTITION SWITCH IN 문에 사용되는 준비 테이블에는 SYSTEM_TIME PERIOD 정의가 필요하지만 시스템 버전 temporal 테이블일 필요는 없습니다.The staging table that is used in the PARTITION SWITCH IN statement with a system-versioned temporal table must have SYSTEM_TIME PERIOD defined, but it does not need to be a system-versioned temporal table.
이렇게 하면 준비 테이블로 데이터를 삽입하거나 미리 채워진 준비 테이블에 SYSTEM_TIME 기간이 추가되는 동안 임시 일관성 검사가 수행되도록 합니다.This ensures that temporal consistency checks are performed during the data insert into a staging table or when SYSTEM_TIME period is added to a pre-populated staging table.

/*Create staging table with period definition for SWITCH IN temporal table*/   
CREATE TABLE [dbo].[Staging_Department_Partition2]  
(   
     [DeptID] [int] NOT NULL  
   , [DeptName] [varchar](50)  NOT NULL  
   , [ManagerID] [int] NULL  
   , [ParentDeptID] [int] NULL  
   , [SysStartTime] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL  
   , [SysEndTime] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL  
   , PERIOD FOR SYSTEM_TIME ( [SysStartTime], [SysEndTime] )   
) ON [PRIMARY]   

/*Create aligned primary key*/   
ALTER TABLE [dbo].[Staging_Department_Partition2]    
ADD CONSTRAINT [Staging_Department_Partition2_PK]  
   PRIMARY KEY CLUSTERED  
   (  [DeptID] ASC )     
   ON [PRIMARY]   

/*   
Create and enforce constraints for partition boundaries.   
Partition 2 contains rows with DeptID > 100 and DeptID <=200   
*/   
ALTER TABLE [dbo].[Staging_Department_Partition2]      
   WITH CHECK ADD  CONSTRAINT [chk_staging_Department_partition_2]     
   CHECK  ([DeptID]>N'100' AND [DeptID]<=N'200')   
ALTER TABLE [dbo].[Staging_Department_Partition2]    
   CHECK CONSTRAINT [chk_staging_Department_partition_2]   

/*Load data into staging table*/   
INSERT INTO [dbo].[staging_Department] ([DeptID],[DeptName],[ManagerID],[ParentDeptID])   
VALUES (101,'D101',1,NULL)  

/*Use PARTITION SWITCH IN to efficiently add data to current table */    
ALTER TABLE [Staging_Department]    
SWITCH TO [dbo].[Department] PARTITION 2;  

기간을 정의하지 않고 테이블에서 PARTITION SWITCH를 수행하려고 하면 오류 메시지가 표시됩니다. Msg 13577, Level 16, State 1, Line 25 ALTER TABLE SWITCH statement failed on table 'MyDB.dbo.Staging_Department_2015_09_26' because target table has SYSTEM_TIME PERIOD while source table does not have it.If you try to perform PARTITION SWITCH from a table without period definition you’ll get error message: Msg 13577, Level 16, State 1, Line 25 ALTER TABLE SWITCH statement failed on table 'MyDB.dbo.Staging_Department_2015_09_26' because target table has SYSTEM_TIME PERIOD while source table does not have it.

데이터 업데이트Updating data

일반 UPDATE 문으로 현재 테이블의 데이터를 업데이트합니다.You update data in the current table with a regular UPDATE statement. 기록 테이블의 현재 테이블 데이터를 "oops" 시나리오용으로 업데이트할 수 있습니다.You can update data in the current table from the history table to for the "oops" scenario. 하지만 PERIOD 열을 업데이트할 수 없으며 SYSTEM_VERSIONING = ON상태에서 기록 테이블의 데이터를 직접 업데이트할 수 없습니다.However, you cannot update PERIOD columns and you cannot directly updated data in the history table while SYSTEM_VERSIONING = ON.
SYSTEM_VERSIONING = OFF 를 설정하고 현재 및 기록 테이블의 행을 업데이트합니다. 다만 시스템에 변경 기록이 보존되지 않는다는 것에 유의합니다.Set SYSTEM_VERSIONING = OFF and update rows from current and history table but keep in mind that way system will not preserve history of changes.

현재 테이블 업데이트Updating the current table

이 예제에서는 DeptID = 10인 행에 대해 ManagerID 열이 업데이트됩니다.In this example, the ManagerID column is updated for each row where the DeptID = 10. PERIOD 은 어떤 방식으로든 참조되지 않습니다.The PERIOD columns are not referenced in any way.

UPDATE [dbo].[Department] SET [ManagerID] = 501 WHERE [DeptID] = 10  

하지만 PERIOD 열을 업데이트할 수 없으며 기록 테이블을 업데이트할 수 없습니다.However, you cannot update a PERIOD column and you cannot update the history table. 이 예제에서는 PERIOD 열을 업데이트하려는 시도로 인해 오류가 발생합니다.In this example, an attempt to update a PERIOD column generates an error.

UPDATE [dbo].[Department]    
SET SysStartTime = '2015-09-23 23:48:31.2990175'    
WHERE DeptID = 10 ;  

Msg 13537, Level 16, State 1, Line 3   
Cannot update GENERATED ALWAYS columns in table 'TmpDev.dbo.Department'.  

기록 테이블에서 현재 테이블 업데이트Updating the current table from the history table

현재 테이블에 UPDATE 를 사용하여 실제 행 상태를 과거 특정 지점의 유효한 상태로 되돌릴 수 있습니다(“마지막으로 알려진 행 버전”으로 되돌리기).You can use UPDATE on the current table to revert the actual row state to valid state at a specific point in time in the past (reverting to a “last good known row version”). 다음 예제에서는 기록 테이블의 값으로, DeptID = 10인 2015-04-25으로 되돌리는 것을 보여줍니다.The following example shows reverting to the values in the history table as of 2015-04-25 where the DeptID = 10.

UPDATE Department   
SET DeptName = History.DeptName   
FROM Department    
FOR SYSTEM_TIME AS OF '2015-04-25' AS History   
WHERE History.DeptID  = 10   
AND Department.DeptID = 10 ;  

데이터 삭제Deleting data

일반 DELETE 문으로 현재 테이블의 데이터를 삭제합니다.You delete data in the current table with a regular DELETE statement. 삭제된 행의 종료 기간 열은 기본 트랜잭션의 시작 시간으로 채워집니다.The end period column for deleted rows will be populated with the begin time of underlying transaction.
SYSTEM_VERSIONING = ON상태이면 기록 테이블에서 행을 직접 삭제할 수 없습니다.You cannot directly delete rows from history table while SYSTEM_VERSIONING = ON.
SYSTEM_VERSIONING = OFF 를 설정하고 현재 및 기록 테이블의 행을 삭제합니다. 다만 시스템에 변경 기록이 보존되지 않는다는 것에 유의합니다.Set SYSTEM_VERSIONING = OFF and delete rows from current and history table but keep in mind that way system will not preserve history of changes.
현재 테이블 및SWITCH PARTITION OUT, TRUNCATE , SWITCH PARTITION OUTSYSTEM_VERSIONING = ON상태에서는 지원되지 않습니다.TRUNCATE, SWITCH PARTITION OUT of current table and SWITCH PARTITION IN history table are not supported while SYSTEM_VERSIONING = ON.

MERGE를 사용하여 temporal 테이블의 데이터 수정Using MERGE to modify data in temporal table

MERGE 연산은 PERIOD 열에 대한 INSERTUPDATE 문의 제한 사항과 같은 제한 사항으로 지원됩니다.MERGE operation is supported with the same limitations that INSERT and UPDATE statements have regarding PERIOD columns.

CREATE TABLE DepartmentStaging (DeptId INT, DeptName varchar(50));   
GO   
INSERT INTO DepartmentStaging VALUES (1, 'Company Management');   
INSERT INTO DepartmentStaging VALUES (10, 'Science & Research');   
INSERT INTO DepartmentStaging VALUES (15, 'Process Management');   

MERGE dbo.Department AS target   
USING (SELECT DeptId, DeptName FROM DepartmentStaging) AS source (DeptId, DeptName)   
ON (target.DeptId = source.DeptId)   
WHEN MATCHED THEN    
    UPDATE   
   SET DeptName = source.DeptName   
WHEN NOT MATCHED THEN   
   INSERT (DeptName)   
   VALUES (source.DeptName);  

이 문서가 도움이 되었나요?Did this Article Help You? 여러분의 의견을 환영합니다.We’re Listening

어떤 정보를 찾고 계세요? 정보를 찾으셨나요?What information are you looking for, and did you find it? 여러분의 의견은 문서의 내용을 개선하는 데 많은 도움이 됩니다.We’re listening to your feedback to improve the content. 의견이 있으면 sqlfeedback@microsoft.comPlease submit your comments to sqlfeedback@microsoft.com

참고 항목See Also

임시 테이블 Temporal Tables
시스템 버전 임시 테이블 만들기 Creating a System-Versioned Temporal Table
시스템 버전 임시 테이블의 데이터 쿼리 Querying Data in a System-Versioned Temporal Table
시스템 버전 임시 테이블의 스키마 변경 Changing the Schema of a System-Versioned Temporal Table
시스템 버전 임시 테이블에서 시스템 버전 관리 중지Stopping System-Versioning on a System-Versioned Temporal Table