Oracle - 功能不能正常工作Oracle - 功能不能正常工作
所以我不知道我在做錯什麼。我已經呆了好幾個小時了,我真的很感激一些幫助。
所以基本上我有2個表,一個被稱爲student
和它的學生名單與student_no
作爲主鍵,另一臺名爲enrol
基本上有該學生被錄取到程序列表。
所以我寫了一個函數,將登錄的學生的用戶名(在本例中爲student_no
)與學生列表進行比較,並確保登錄的用戶是學生。然後它將student_no
與enrol
表進行比較,以查找用戶註冊到的任何程序。因此,實質上當我SELECT * FROM yaser.enrol
(表所有者是yaser)時,我應該只能從註冊列表中看到幾條記錄。相反,我得到的錯誤:failed to execute policy function
。
這裏是我的功能:
-- Create policy function to be called when 'ENROL' table is accessed
create or replace function f_policy_enrol (schema in varchar2, tab in varchar2)
-- Function will return a string that is used as a WHERE clause
return varchar2
as
v_student_no varchar2(10);
is_student number:=0;
v_user varchar2(100);
out_string varchar2(400) default '1=2 ';
begin
-- get session user
v_user := lower(sys_context('userenv','session_user'));
-- Is the user a student?
begin
select student_no into v_student_no from student where lower(student_no) = v_user;
is_student:=1;
exception
when no_data_found then
v_student_no := 0;
end;
-- If it's a student, then they are only allowed to see their record only.
if is_student = 1 then
out_string := out_string||'or student_no = '||v_student_no||' ';
end if;
return out_string;
end;
/
這是我調用策略:
begin
dbms_rls.add_policy('yaser',
'enrol',
'accesscontrol_enrol',
'yaser',
'f_policy_enrol',
policy_type => dbms_rls.context_sensitive);
end;
/
至於說before..I'm不知道我要去哪裏錯了。無論是在政策還是功能上。任何幫助將不勝感激!如果您有任何問題,我很高興回答,只要我有空工作一段時間!
在此先感謝!
亞瑟
你說得對。它是一個'VARCHAR(10)'。儘管在應用修復程序後,它也給我提供了同樣的錯誤。我對Oracle非常陌生,老實說,我只是通過手動調用函數來了解你的意思。我做到了這一點,同樣的錯誤。還要別的嗎? :)感謝您的輸入堆。 –
@YaserSleiman - 你是否在說,當你手動調用這個函數'從雙重'選擇f_policy_enrol(null,null),你會得到一個VPD相關的錯誤?這似乎不太可能。 –
對不起!我誤解了。我以爲你的意思是'out_string:= out_string ||'或者student_no ='''|| v_student_no ||''''FROM yaser.enrol;'。恩,在這種情況下,我很抱歉,我不知道如何手動調用函數。 :( –