Database ORA-28113:策略谓词有错误

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

我需要一些关于Oracle虚拟专用数据库功能的帮助。我以前从未使用过它,但是在网上做了一些关于它的研究,但是我遇到了一个问题

以下是我采取的步骤:

量子力学:

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>;