我必须申请VPD并且我创建了一个函数。我从student表中取出了student_no,根据该student_no,vpd将从注册表中显示该学生的信息。但每次我从oe.enrol做select *时都表示没有选择任何行。如果我不应用vpd它会显示所有输出,因此授权正在工作,但只应用此函数,它表示没有选择任何行。请有人提出建议。
connect sec_admin/welcome1;
CREATE or REPLACE function f_policy_enrol
(schema in varchar2, tab in varchar2)
return varchar2
as
v_student_no number:=0;
is_student number:=0;
v_user varchar2(100);
out_string varchar2(400) default '1=2';
begin
v_user := sys_context('userenv','session_user');
begin
SELECT e.student_no into v_student_no from oe.STUDENT e where e.student_no = v_user;
is_student:=1;
exception
when no_data_found then
v_student_no := 0;
end;
if is_student=1 then
out_string := out_string||'or student_no='||v_student_no||'';
end if;
return out_string;
end;
/
答案 0 :(得分:0)
我不喜欢这一行的外观:
SELECT e.student_no into v_student_no from oe.STUDENT e where e.student_no = v_user;
你的意思是e.student_username = v_user
而不是e.student_no = v_user
吗? (我不知道你的桌子有哪些列,所以我猜他们的名字。)
顺便说一句,为了调试VPD策略,您是否尝试在策略函数中使用DBMS_OUTPUT.PUT_LINE
?如果您使用的是SQL * Plus且已输入SET SERVEROUTPUT ON
,我希望在您运行使用该策略的查询时,会显示在VPD策略函数期间生成的输出。 (但是,我恐怕现在无法验证.VPD仅在Oracle Enterprise Edition中可用,我目前只能访问XE。)