0

我必须应用 VPD 并且我创建了一个函数。我从学生表中取出了 student_no,根据该 student_no,vpd 将显示来自登记表的学生信息。但是每次我从 oe.enrol 中选择 * 时,它都会说没有选择行。如果我不应用 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;
/
4

1 回答 1

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 企业版中可用,而我目前只能访问 XE。)

于 2013-09-19T20:27:07.733 回答