Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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. 

...