Site icon DBA의 정석

Temporal Validity Oracle 12c

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

Exit mobile version