صورت مسئله :
بدلیل حساس بودن دیتای موجود در یک ستون خاص ، میخواهیم کاری کنیم که در صورتی که تنها کاربران دارای مجوز مشاهده آن ستون به دیتابیس لاگین نمودند توانایی دیدن محتوای ستون مورد نظر را داشته باشند .
مراحل کار :
1- ایجاد یک تابع جهت تعریف کاربران مجاز
create or replace function VPD( p_owner in varchar2, p_name in varchar2 ) return varchar2
as
begin
if sys_context( 'userenv', 'session_user' ) in( 'user1','user2') --and SYS_CONTEXT('USERENV','HOST')in('DOMAIN\TESTPC','hamed')
and sys_context('userenv','ip_address') in ('192.168.1.10','192.168.1.20')
then
return NULL;
else
return '1=0';
end if;
end;
/
2- ایجاد یک POLICY به شکل زیر
BEGIN
DBMS_RLS.ADD_POLICY(object_schema=>'scott',
object_name=>'test1',
policy_name=>'english_name_col',
function_schema=>'scott',
policy_function=>'VPD',
sec_relevant_cols=>'ENGLISH_NAME,DESCRIPTION',
sec_relevant_cols_opt=>dbms_rls.ALL_ROWS);
END; /
با زدن SELECT زیر فقط کاربرانی میتوانند دیتای دو ستون فوق را مشاهده کنند که در تابع VPD اسامی آنها ذکر شده باشد
SELECT * FROM TEST1;
در صورتی که بخواهیم کاربرانی که ما تعریف میکنیم نتوانند محتویات برخی از ستونها را مشاهده کنند تابع به شکل زیر باید تغییر داده شود :
create or replace function VPD( p_owner in varchar2, p_name in varchar2 ) return varchar2
as
begin
if sys_context( 'userenv', 'session_user' ) in( 'user1','user2') --and SYS_CONTEXT('USERENV','HOST')in('DOMAIN\TESTPC','hamed')
and sys_context('userenv','ip_address') in ('192.168.1.10','192.168.1.20')
then
return '1=0';
else
return NULL;
end if;
end;