ORA-28113: Politik-Prädikat hat Fehler
Brauche ich etwas Hilfe mit Oracle VPD-Funktion. Ich habe es nie benutzt, bevor, aber habe einige online-Forschung über Sie, aber ich ' m laufen in ein problem.
Hier sind die Schritte, die ich genommen habe:
QuanTriDL:
create table NhanVien2
QuanTriVPD:
CREATE OR REPLACE CONTEXT ThongTinTaiKhoan USING TTTK_PKG;
CREATE OR REPLACE PACKAGE TTTK_PKG IS
PROCEDURE GetTTTK;
END;
/
CREATE OR REPLACE PACKAGE BODY TTTK_PKG IS
PROCEDURE GetTTTK AS
TaiKhoan varchar(30);
tenPhong varchar(30);
tenChucVu varchar(30);
tenMaNV varchar(10);
BEGIN
TaiKhoan := LOWER(SYS_CONTEXT('USERENV','SESSION_USER'));
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetTaiKhoan',TaiKhoan);
if (TaiKhoan = 'nv001') then
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetChucVu','Giam doc');
else
if (TaiKhoan = 'nv002') then
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetChucVu','Truong phong');
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetPhong','Kinh doanh');
else
if (TaiKhoan = 'nv006') then
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetChucVu','Truong phong');
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetPhong','Ky thuat');
else
DBMS_SESSION.set_context('ThongTinTaiKhoan','GetChucVu','Nhan vien');
end if;
end if;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL;
END GetTTTK;
END;
/
CREATE OR REPLACE TRIGGER RangBuocTTTK AFTER LOGON ON DATABASE
BEGIN QuanTriVPD.TTTK_PKG.GetTTTK;
EXCEPTION WHEN NO_DATA_FOUND
THEN NULL;
END;
/
dann:
CREATE OR REPLACE FUNCTION Select_Nhanvien(
schema_p IN VARCHAR2,
table_p IN VARCHAR2)
RETURN VARCHAR2
AS
getChucVu varchar(50);
trave varchar2(1000);
BEGIN
SELECT SYS_CONTEXT('ThongTinTaiKhoan','GetChucVu') into getChucVu FROM DUAL;
trave := '1=2';
if (getChucVu = 'Giam doc') then
trave := NULL;
else
if (getChucVu = 'Truong phong') then
trave :='Phong=(SELECT SYS_CONTEXT(''ThongTinTaiKhoan'',''GetPhong'') FROM DUAL)';
else
trave :='TenTaiKhoan=(SELECT SYS_CONTEXT(''ThongTinTaiKhoan'',''GetTaiKhoan'') FROM DUAL)';
end if;
end if;
RETURN trave;
END;
/
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'QuanTriDL',
object_name => 'NhanVien2',
policy_name => 'VPD_Select_Nhanvien',
function_schema => 'QuanTriVPD',
policy_function => 'Select_Nhanvien',
statement_types => 'SELECT');
END;
/
Beim anschließen als nv001, nv002, nv006 ist es OK. Aber die Verbindung anderer Benutzer:
ORA-28113: Politik-Prädikat hat Fehler
Warum kommt es zu diesen Fehler?
InformationsquelleAutor Quang Minh | 2015-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Jahr, alte Frage, aber da stolperte ich über es, ich werde gehen Sie vor und beantworten für jemand anderes...)
ORA-28113 bedeutet nur, dass, wenn Sie Ihre politische Funktion zurückgegeben, die eine where-Klausel, die resultierende SQL-hatte einige Fehler. Sie können details durch die Betrachtung der trace-Datei. Versuchen Sie auch, das:
Und dann fügen Sie die Ergebnisse einer WHERE-Klausel wie dieser:
Dann sollten Sie die Ursache. Ich vermute, in dem Fall über die "anderen user" nicht haben entweder die sys_context-Variablen erforderlich, um das erstellen der where-Klausel, oder der Zugriff auf den login auslösen.
Als eine Randnotiz, ein weiteres problem, das Sie ausführen können, in hier ist zirkuläre Referenz, wenn Sie Ihre politische Funktion verweist auf einen eigenen Tisch - idealerweise würde ich erwarten, dass eine politische Funktion zu umgehen, selbst innerhalb der politischen Funktion, so dass Sie tun können, NICHT VORHANDEN ist, etc, aber es scheint nicht zu funktionieren auf diese Weise.
InformationsquelleAutor joehitt