Oracle Temporal Validity

Herkese Selam,

Bu yazıda Oracle 12c R1 ile beraber gelen yeni özelliklerden temporal validity konusuna değineceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Temporal Validty, elimizdeki datayı belirli bir tarih aralığı için geçerli kılıp tablomuzu zamana bağlı olarak sorgulayabildiğimiz bir alt yapı sunuyor bize. Tablodaki datanın herhangi bir zaman aralığında durumunu incelememize veya kullanmamıza olanak sağlayan bir mekanizma aslında.

Şimdi hızlıca örneklere geçip konuyu anlamaya çalışalım.

İlk etapta senaryomuzdan bahsedelim. Elimizde bir invoice tablosu olsun ve bu tablodaki her kaydın (yani faturanın) bir geçerlilik aralığı olsun bizim tarafımızdan belirlenen. Daha sonra bu eklediğimiz kayıtların geçerlilik tarihlerine göre session parametrelerimizi değiştirip tablomuzun istediğimiz zaman dilimindeki durumunu sorgulayalım.

CREATE TABLE hr.invoice
  (
    custid    NUMBER,
    inv_no    NUMBER,
    inv_total NUMBER,
    inv_date  DATE,
    t_date    TIMESTAMP
  ); 

INSERT INTO hr.invoice VALUES  (1,1,100,sysdate-30,sysdate);
INSERT INTO hr.invoice VALUES  (1,2,900,sysdate-60,sysdate);
INSERT INTO hr.invoice VALUES  (1,3,700,sysdate-90,sysdate);
INSERT INTO hr.invoice VALUES  (1,4,600,sysdate-120,sysdate);
INSERT INTO hr.invoice VALUES  (1,5,300,sysdate-150,sysdate);
INSERT INTO hr.invoice VALUES  (1,6,200,sysdate-180,sysdate);
COMMIT;

Evet tablomuzu oluşturup içine data girdik. Şimdi tablomuza zaman boyutu kazandıracak özelliği çalıştırmaya geldi sıra.

ALTER TABLE hr.invoice ADD PERIOD FOR valid_time;   

PERIOD FOR söz deyimini kullanarak tablomuzun zaman boyutu kazanmasını sağladık. Bunu tablomuzu yaratırken de aşağıdaki şekilde yapabilirdik.

CREATE TABLE hr.invoice
  (
    custid    NUMBER,
    inv_no    NUMBER,
    inv_total NUMBER,
    inv_date  DATE,
    t_date    TIMESTAMP,
    PERIOD FOR valid_time
  ); 

(PERIOD FOR söz deyiminin farklı kullanım syntaxlarıda mevcut yazı sonundaki linklerden incelyebilirsiniz.)
Evet tablomuzu zamana göre sorgulayabileceğimiz alt yapıyıda bir önceki işlem ile yapmış olduk. PERIOD FOR söz deyimi ile verdiğimiz valid_time adını kullanarak oracle arka tarafta invisible olacak şekilde 2 kolon oluşturdu aslında. Bunların adı;
valid_time_start
valid_time_end
dictionary’den sorguladığımız takidrde bu kolonların varlığını invisible olduğundan göremeyeceğiz.

SELECT owner,
  table_name,
  column_name,
  data_type
FROM all_tab_columns
WHERE owner    = 'HR'
AND table_name = 'INVOICE';

tmv

Şimdi PERIOD FOR ile zaman boyutu kazandırdığımız tablomuzun invisible yaratılan ve zamana göre geçerliliğini ayarlayabileceğimiz valid_time_start ve valid_time_end kolonlarını her kayıt için update edelim.

UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP - INTERVAL '20' MINUTE,
    valid_time_end   = SYSTIMESTAMP - INTERVAL '10' MINUTE
WHERE inv_no         =1;


UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP - INTERVAL '20' MINUTE,
    valid_time_end   = SYSTIMESTAMP - INTERVAL '10' MINUTE
WHERE inv_no         =2;

UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP - INTERVAL '15' MINUTE,
    valid_time_end   = SYSTIMESTAMP - INTERVAL '5'  MINUTE
WHERE inv_no         =3;

UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP - INTERVAL '19' MINUTE,
    valid_time_end   = SYSTIMESTAMP - INTERVAL '10' MINUTE
WHERE inv_no         =4;

UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP - INTERVAL '14' MINUTE,
    valid_time_end   = SYSTIMESTAMP - INTERVAL '3'  MINUTE
WHERE inv_no         =5;

UPDATE hr.invoice
SET valid_time_start = SYSTIMESTAMP + INTERVAL '2' MINUTE,
    valid_time_end   = SYSTIMESTAMP + INTERVAL '5'  MINUTE
WHERE inv_no         =6;

COMMIT;

Yaptığımız updateler ile her bir kayıdı zaman içerinde belirli anlarda valid kıldık. Şuan sessionımın flashback ayarlarına dokunmadan tablomu sorguladığımda karşıma nasıl bir sonuç çıkıyor?

tmv2

Evet session flashback ayarıma dokunmadan sorguladığımda tablomun içindeki tüm datamı görüntüleyebildim. Peki tabloyu belirli periyod veya nokta bir tarih için nasıl sorgulayabilirim?

Evet bu sorunun birden çok cavabı var şimdi yönetemlere sırası ile bakalım.

VERİYİ ZAMANA GÖRE SORGULAMA

1- DBMS_FLASHBACK_ARCHIVE : DBMS_FLASHBACK_ARCHIVE paketini kullanarak bu sorgulamayı gerçekleyebiliriz. Ancak bunu kullanabilmek için bağlandığımız user’ın bu paket üzerinde yetkisinin olması gerekiyor.

GRANT ALL ON SYS.dbms_flashback_archive TO HR;

Bu hakkı user’a verdikten sonra şimdi zamanı session bazlı ayarlayıp sorgumuzu tekrar çalıştırabiliriz.

EXECUTE SYS.DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME('ASOF', SYSTIMESTAMP - INTERVAL '7' MINUTE);

Yukarıdaki satır ile sessionımızda 7 dakika önceyi enable ettik. Şimdi bu zaman diliminde valid olan datamıza bakalım.

SELECT * from hr.invoice; 

tmv3

Evet 7 dakika önce geçerli olan kayıtları listeledik. Bu örnekten zamanda sadece geri gidebildiğimiz akıllılara gelmesin. Zamanda validity periodu ileriki olan bir zaman diliminede gidip o anki durumu inceleyebiliriz.

EXECUTE SYS.DBMS_FLASHBACK_ARCHIVE.ENABLE_AT_VALID_TIME('ASOF', SYSTIMESTAMP + INTERVAL '3' MINUTE);

3 dakika sonrayı enable ettik. Şimdi tekrar sorgulayalım.

SELECT * from hr.invoice; 

tmv3

Evet görüldüğü üzere 3 dakika sonra valid olan kayıt karşımıza geldi.

2- AS OF PERIOD FOR ve VERSIONS PERIOD FOR söz deyimleri: Bir önceki örnekteki gibi 7 dakika önceki durumu bu yöntem ile sorgulayalım.

SELECT * from hr.invoice AS OF PERIOD FOR valid_time SYSTIMESTAMP - INTERVAL '7' MINUTE;

tmv3

Şimdi ise 10 dk önce ile 18 dakika önceki zaman aralığını sorgulayalım.

SELECT * from hr.invoice VERSIONS PERIOD FOR valid_time between  SYSTIMESTAMP - INTERVAL '18' MINUTE and  SYSTIMESTAMP - INTERVAL '10' MINUTE;

tmv5

Evet yukarıdaki yöntemler ile datamızı istediğimiz gibi sorgulayabilmekteyiz. Hatta datayı 2. yöntem ile çekip başka tablolar ile de joinleyebiliriz. Buna ek olarak, Temporal Validity alt yapısında, tablomuzdaki unique key constraint içeren kolonlarda, kayıtların zamansal olarak üst üste gelmeyecekleri garanti edilerek. Bu constraintin çiğnenmesine olanak verilir. Yani her biri farklı validty periodlar içinde olmak kaydı ile aynı unique key içeren kayıtlar tabloda birden fazla bulunabilir.

KAYNAKLAR

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s