Database ORA-28113:策略谓词有错误
我需要一些关于Oracle虚拟专用数据库功能的帮助。我以前从未使用过它,但是在网上做了一些关于它的研究,但是我遇到了一个问题 以下是我采取的步骤: 量子力学:Database ORA-28113:策略谓词有错误,database,oracle,oracle11g,vpd,Database,Oracle,Oracle11g,Vpd,我需要一些关于Oracle虚拟专用数据库功能的帮助。我以前从未使用过它,但是在网上做了一些关于它的研究,但是我遇到了一个问题 以下是我采取的步骤: 量子力学: create table NhanVien2 QuanTriVPD: CREATE OR REPLACE CONTEXT ThongTinTaiKhoan USING TTTK_PKG; CREATE OR REPLACE PACKAGE TTTK_PKG IS PROCEDURE GetTTTK; END; / CREATE O
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;
/
然后:
当连接为nv001、nv002、nv006时,一切正常。但是连接另一个用户:
ORA-28113:策略谓词有错误
为什么它会导致这个错误?(一个古老的问题,但由于我偶然发现了它,我将继续为其他人回答它…)
ORA-28113只是意味着,当您的策略函数返回where子句时,生成的SQL出现了一些错误。您可以通过查看跟踪文件获得详细信息。此外,请尝试:
select Select_Nhanvien('myschema','mytable') from dual;
然后将结果附加到WHERE子句,如下所示:
SELECT * FROM MYTABLE WHERE <results from above>;
从MYTABLE中选择*,其中;
然后你应该看到根本原因。我猜在上面的例子中,“other user”既没有构建where子句所需的sys\u上下文变量,也没有访问login触发器的权限
作为旁注,这里您可能遇到的另一个问题是,当您的策略函数引用自己的表时,循环引用-理想情况下,我希望策略函数在策略函数中绕过自身,这样您就不存在了,等等,但它似乎不是这样工作的
SELECT * FROM MYTABLE WHERE <results from above>;