Temporal Validity
Temporal Validity는 valid time dimension을 테이블에 연결시킴으로써 시간 기준으로 해당 데이터의 유효한 지 여부에 따라 데이터를 보이게 하거나 보이지 않게 하는 Oracle Database 12c New Feature입니다.
Sample 테이블을 가지고 Temporal Validity를 실습해 보겠습니다. [PDB1]에서 진행합니다.
먼저 [PDB1]에 SYS 유저로 접속하여 실습 유저인 HR 소유의 테스트용 테이블을 생성합니다. 그런 다음 테스트 테이블에 valid time dimension을 추가합니다.
[oracle@New-Features-12c ~]$ sqlplus sys/oracle_4U@pdb1 as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Wed Sep 30 08:47:29 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c EE Extreme Perf Release 12.1.0.2.0 – 64bit Production With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics and Real Application Testing options SQL> create table hr.emp_temp as select employee_id,first_name,salary from hr.employees where rownum <= 10; Table created. SQL> alter table hr.emp_temp add period for valid_time; Table altered. |
valid time 관련 칼럼은 Describe 명령에서는 나타나지 않고 쿼리에서 해당 칼럼을 명시했을때만 나타납니다.
SQL> set lines 70 SQL> desc hr.emp_temp; Name Null? Type ———————————– ——– ———————— EMPLOYEE_ID NUMBER(6) FIRST_NAME VARCHAR2(20) SALARY NUMBER(8,2) |
테이블에 valid time dimension이 추가된 상태에서 valid-time 칼럼 값을 조회해 보겠습니다. 현재는 설정된 내용이 없습니다.
SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp; FIRST_NAME Start End ——————– ———- ———- Steven Neena Lex Alexander Bruce David Valli Diana Nancy Daniel 10 rows selected. |
이제 valid-time 칼럼 (valid_time_start, valid_time_end) 을 아래와 같이 업데이트하고 조회해 보겠습니다. valid-time 이 각 로우에 설정된 것을 알 수 있습니다.
SQL> update hr.emp_temp set valid_time_start = to_date(‘1995/06/01′,’yyyy/mm/dd’), valid_time_end = to_date(‘2010/09/15′,’yyyy/mm/dd’) where first_name in (‘Lex’,’Alexander’,’Bruce’,’David’,’Daniel’); 5 rows updated. SQL> update hr.emp_temp set valid_time_start = to_date(‘1999/08/01′,’yyyy/mm/dd’), valid_time_end = to_date(‘2012/03/01′,’yyyy/mm/dd’) where first_name in (‘Steven’,’Diana’); 2 rows updated. SQL> update hr.emp_temp set valid_time_start = to_date(‘1998/03/20′,’yyyy/mm/dd’) where first_name in (‘Neena’,’Nancy’,’Valli’); 3 rows updated. SQL> commit; Commit complete. SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp order by 2; FIRST_NAME Start End ——————– ———- ———- Bruce 1995/06/01 2010/09/15 David 1995/06/01 2010/09/15 Daniel 1995/06/01 2010/09/15 Alexander 1995/06/01 2010/09/15 Lex 1995/06/01 2010/09/15 Valli 1998/03/20 Nancy 1998/03/20 Neena 1998/03/20 Diana 1999/08/01 2012/03/01 Steven 1999/08/01 2012/03/01 10 rows selected. |
이제 Flashback 쿼리를 이용해서 2011년 6월 1일 현재 유효한 데이터를 조회해 보겠습니다.
SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp as of period for valid_time to_date(‘2011/06/01′,’yyyy/mm/dd’) order by 2; FIRST_NAME Start End ——————– ———- ———- Valli 1998/03/20 Nancy 1998/03/20 Neena 1998/03/20 Diana 1999/08/01 2012/03/01 Steven 1999/08/01 2012/03/01 |
이번에는 1995년 9월 1일부터 1996년 9월 1일 사이 기간 동안 유효한 데이터를 VERSIONS … BETWEEN 구문을 이용해서 조회해 보겠습니다.
SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp versions period for valid_time between to_date(‘1995/09/01′,’yyyy/mm/dd’) and to_date(‘1996/09/01′,’yyyy/mm/dd’) order by 2; FIRST_NAME Start End ——————– ———- ———- Lex 1995/06/01 2010/09/15 Alexander 1995/06/01 2010/09/15 Daniel 1995/06/01 2010/09/15 David 1995/06/01 2010/09/15 Bruce 1995/06/01 2010/09/15 |
이제 dbms_flashback_archive.enable_at_valid_time 프로시저를 이용해서 temporal support가 활성화된 테이블의 데이터을 visibility를 조정해 보겠습니다. 먼저 현재 유효한 데이터만 보이게 설정해서 확인해 봅니다.
SQL> exec dbms_flashback_archive.enable_at_valid_time(‘CURRENT’); PL/SQL procedure successfully completed. SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp order by 2; FIRST_NAME Start End ——————– ———- ———- Neena 1998/03/20 Nancy 1998/03/20 Valli 1998/03/20 |
모든 데이터가 보이도록 변경하고 이를 확인합니다.
SQL> exec dbms_flashback_archive.enable_at_valid_time(‘ALL’); PL/SQL procedure successfully completed. SQL> select first_name, to_char(valid_time_start,’yyyy/mm/dd’) “Start”, to_char(valid_time_end,’yyyy/mm/dd’) “End” from hr.emp_temp order by 2; FIRST_NAME Start End ——————– ———- ———- Bruce 1995/06/01 2010/09/15 David 1995/06/01 2010/09/15 Daniel 1995/06/01 2010/09/15 Alexander 1995/06/01 2010/09/15 Lex 1995/06/01 2010/09/15 Valli 1998/03/20 Nancy 1998/03/20 Neena 1998/03/20 Diana 1999/08/01 2012/03/01 Steven 1999/08/01 2012/03/01 10 rows selected. SQL> exit Disconnected from Oracle Database 12c EE Extreme Perf Release 12.1.0.2.0 – 64bit Production With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics and Real Application Testing options |