2012-01-26 59 views
1

這是一個後續約Oracle的行級安全功能的舊問題最初討論here甲骨文RLS/VPD與政策功能迴路

我需要修改,因爲原來的代碼,如果將返回多個結果用戶被連接到多個項目。所以現在我需要有多個條件(例如project = project_1或project = project_2)傳遞給安全策略才能工作。要做到這一點,我嘗試用一​​個for循環修改代碼,它是不工作...

--create function 
create or replace function 
    table_access_policy 
    (obj_schema varchar2, obj_name varchar2) return varchar2 

is     

v_project_temp varchar2(9000); 

begin    

v_project_temp:= 'declare v_project varchar2(9000); 

begin 
v_project:= ''project = ''; 

for c in (select admin.access_list.project from admin.access_list where upper(admin.access_list.user_id) = SYS_CONTEXT (''USERENV'', ''SESSION_USER'')) 

loop 

v_project := v_project || c.project_sn || '' or project = '' ; 

end loop; 

v_project := rtrim(v_project, '' or project = ''); 

end;'; 

return v_project_temp; 

end; 

的函數保存/運行沒有任何錯誤,但是當它被稱爲政策本身拋出一個錯誤。有一個更好的方法嗎?

回答

2

不應將PL/SQL放入字符串中,而應該運行它並構建要返回的v_project字符串。如:

--create function 
create or replace function 
    table_access_policy 
    (obj_schema varchar2, obj_name varchar2) return varchar2  
is 
    v_project varchar2(9000); 
begin    
    v_project:= 'project = '; 
    for c in (select admin.access_list.project from admin.access_list where upper(admin.access_list.user_id) = SYS_CONTEXT ('USERENV', 'SESSION_USER')) 
    loop 
    v_project := v_project ||''''|| c.project_sn ||''''|||| ' or project = ' ; 
    end loop;  
    v_project := rtrim(v_project, ' or project = ');  
    return v_project;  
end; 

最終出現在v_project值會where後直行在SQL語句如:

select * from data; 

將成爲

select * from date where <v_project>; 

因此,只有東西跟着一個where應該在v_ project

+0

感謝您的回覆。我不知道我可以通過安全策略。我認爲我們必須通過查詢,並且策略必須實時執行查詢。 不幸的是我仍然得到「政策謂詞有錯誤」。 我試着手動運行你的代碼而沒有「Create function ...」,並且它返回了預期的結果。有任何想法嗎? – AFJ

+0

我在'USERENV'和'SESSION_USER'周圍留下了額外的引號。我編輯了答案以刪除它們。看看是否有效。 –

+0

我在您的回覆中發現了額外的引號,並且提前刪除了它們。仍然沒有運氣 – AFJ