Bonjour,

je suis en train de mettre en place une stratégie de VPD qui me permettrait de rajouter un prédicat dans la clause WHERE des requêtes effectuées sur certaines tables.

j'ai défini un package me permettant de gérer les variables de mon contexte.
J'ai défini
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
-- creation of PRUNING context 
DROP CONTEXT PRUNING;
CREATE CONTEXT PRUNING using vpd_context;
 
-- package used by the context
create or replace package vpd_context as
	procedure set_comar(v_comar in varchar2);
	procedure clear_pruning;
end;
/
 
-- package body
-- we have to remember that the procedures of this package are the only ones that can change context settings
create or replace package body vpd_context is
 
	-- Set the value of COMAR variable in the PRUNING context
	PROCEDURE set_comar(v_comar in varchar2) IS			
	BEGIN	
		dbms_session.set_context('PRUNING', 'COMAR', v_comar);	
	END set_comar; 
 
	-- Delete values of all variables in the pruning context
	PROCEDURE clear_pruning IS			
	BEGIN	
		dbms_session.clear_context('PRUNING');	
	END clear_pruning; 
 
END vpd_context; 
/
J'ai également crée un package me permettant de génerer les predicats en fonction de la valeur de mon contexte:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
-- creating the package responsible for generating the predicates
create or replace package get_predicates as
 
	function get_comar (owner varchar2, object_name varchar2) return varchar2;
 
	-- other functions might be added here for DELETE or UPDATE
 
end get_predicates;
/
create or replace package body get_predicates as
 
	FUNCTION GET_COMAR (owner varchar2, object_name varchar2) return varchar2 is 
 
		ret_predicate varchar2(1000); -- part of the where clause
 
	BEGIN
 
		ret_predicate := 'COMAR = ' || sys_context('PRUNING','COMAR');
		--ret_predicate := 'COMAR in (' || sys_context('PRUNING','COMAR') || ')';
 
	END GET_COMAR;
 
	-- other functions might be added here for DELETE or UPDATE
 
end get_predicates;
/
Il me reste à créer ma policy et je voulais savoir comment appliquer la même fonction de génération de predicats à plusieurs tables sans avoir à définir autant de policies que de tables.