...
La fonction déterminante (predicate) est celle qui retourne la condition à ajouter lors de chaque query. Dans l'exemple ci-dessous, pour la table HRM_PERSON, la condition est que le département de l'employé doit figurer dans la liste des départements autorisés.
Code Block |
---|
CREATE OR REPLACE package VPD_IND_SETTINGS |
...
as |
...
...
/* Procédure définissant le contexte des droits */ |
...
PROCEDURE set_department; |
...
...
/* fonction retournant la clause where de la policy */ |
...
function predicate (obj_schema varchar2, obj_name varchar2) return varchar2; |
...
...
end VPD_IND_SETTINGS; |
...
/ |
...
...
CREATE OR REPLACE package body VPD_IND_SETTINGS as |
...
...
...
/* Filtre sur les départements présents sur l'utilisateur */ |
...
function predicate (obj_schema varchar2, obj_name varchar2) return varchar2 is |
...
begin |
...
if obj_name = 'HRM_PERSON' then |
...
return 'INSTR(SYS_CONTEXT(''hrm_ctx'', ''dic_department_id''),DIC_DEPARTMENT_ID)>0 or SYS_CONTEXT(''hrm_ctx'', ''dic_department_id'') =''EVERYTHING'''; |
...
...
end if; |
...
end predicate; |
...
...
...
/* Définition du contexte */ |
...
PROCEDURE set_department |
...
AS |
...
department varchar2(255); |
...
BEGIN |
...
SELECT CVF_CHAR |
...
INTO department |
...
FROM com_vfields_value r, pc_user u |
...
WHERE cvf_tabname = 'PC_USER' |
...
AND cvf_REC_ID = PC_USER_ID |
...
AND USE_NAME = user |
...
AND cvf_fldname = 'VFLD_DEPARTMENTS'; |
...
DBMS_SESSION.SET_CONTEXT('hrm_ctx', 'dic_department_id', department); |
...
/* Pour gérer les utilisateurs système dans le cadre des dumps, aucun filtre n'est appliqué pour les users oracle qui ne sont pas définis dans PCS */ |
...
EXCEPTION |
...
WHEN NO_DATA_FOUND THEN DBMS_SESSION.SET_CONTEXT('hrm_ctx', 'dic_department_id', 'EVERYTHING'); |
...
END set_department; |
...
...
end VPD_IND_SETTINGS; |
...
/ |
Création du contexte
Un contexte doit être créé en tant que SYS pour contenir l’information qui déterminera le filtre.
...