24 Ağustos 2009 Pazartesi

Oracle veritabanında belli sütunların saklanması

Oracle veritabanında sadece bazı sütünlardaki (kredi kartı no ya da TC Kimlik No gibi) bilgilerin saklanması gerekebilir. Bu alanları şifrelemeden gözlerden saklamak istersek Oracle 10g'den sonra kullanılabilen Virtual Private Database (VPD) "data masking" işimize yarıyor.

Bunun avantajı, veritabanında alanlar decyrpt - encrypt edilmediğinden performans kaybı yaşatmaması..

Önce bir fonksiyon oluşturuyoruz:

CREATE OR REPLACE
FUNCTION vpd_function (obj_owner IN VARCHAR2, obj_name IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN '1=2';
END vpd_function;
/

Bu fonksiyonun döndürdüğü değer (1=2) maskelemek istediğimiz sütunlar için bir where cümlesi vazifesi görecek. Her zaman yanlış olacağından bu alanlar boş gelmiş olacak.

Şimdi bu fonksiyonu kullanacak bir policy tanımlıyoruz:

BEGIN
DBMS_RLS.ADD_POLICY(object_schema=> 'ŞEMA_ADI',
object_name=> 'TABLO_ADI',
policy_name=> 'POLICY_ADI',
function_schema=> 'ŞEMA_ADI',
policy_function=> 'vpd_function',
sec_relevant_cols=> 'VIRGULLE_AYRILMIŞ_SÜTUN_ADLARI',
policy_type => DBMS_RLS.SHARED_STATIC,
sec_relevant_cols_opt=> dbms_rls.ALL_ROWS);

END;
/

Burada POLICY_ADI'na istediğiniz herhangi bir isim verebilirsiniz.

Son olarak bu policy'nin dışında kalacak kullanıcıya izin veriyoruz:

grant exempt access policy to KULLANICI;

Artık ister program kullansın ister yazılım içinde bağlantı kursun, ilgili tabloda select çeken kullanıcı tüm satırları görecek ama belirttiğimiz sütunlar ona boş görünecektir.