Hi,
With the way we have implemented FGAC, we do not have any parses
occurring with application context.
The application context does act like bind variables and I will try to
illustrate that with an example.
We set the context of the users logging in to a particular group/role
which gets executed from a logon trigger
POLICY_NAME FUNCTION
------------------------------ ------------------------------
DPR70_CURRENCY_D_PLCY DP_PREDICATE_FUNCTION
The above is the function defined on the object
Login as a user
SQL> select sys_context('dp_comp_group_id_ctx','comp_group_id')
2 from dual;
SYS_CONTEXT('DP_COMP_GROUP_ID_CTX','COMP_GROUP_ID')
--------------------------------------------------------------------------------
1012
SQL> select count(sql_text) from v$sql where sql_text like '%sys_cont%';
COUNT(SQL_TEXT)
---------------
12
In v$sql
this is the sql that generates the predicate clause vis the function
SELECT text from dp_security_text where object_name = :b1
and comp_group_id = sys_context('dp_comp_group_id_ctx','comp_group_id')
SELECT sys_context(:b2,:b1) from sys.dual
Notice how the context gets converted into bind variables
Also notice the parse_calls and executions
6 16 SELECT text from dp_security_text where
object_name = :b1 and comp_group_id =
sys_context('dp_comp_group_id_ctx','comp_group_id')
Now lets login as a different user
SQL> select sys_context('dp_comp_group_id_ctx','comp_group_id')
2 from dual;
SYS_CONTEXT('DP_COMP_GROUP_ID_CTX','COMP_GROUP_ID')
--------------------------------------------------------------------------------
1011
1* select count(*) from v$sql where sql_Text like '%sys_cont%'
SQL> /
COUNT(*)
----------
12
There is a parse because the user_id is different
7 18 SELECT text from dp_security_text where
object_name = :b1 and comp_group_id =
sys_context('dp_comp_group_id_ctx','comp_group_id')
No lets execute queries as this user
SQL> select count(*) from dpr70_currency_d;
COUNT(*)
----------
3
from V$sql
SQL_TEXT
--------------------------------------------------------------------------------
PARSE_CALLS EXECUTIONS FIRST_LOAD_TIME LOADS LAST_LOAD_TIME
----------- ---------- ------------------- ---------- -------------------
SELECT text from dp_security_text where object_name = :b1
and
comp_group_id = sys_context('dp_comp_group_id_ctx','comp_group_id')
7 20 2003-08-20/09:29:34 2 2003-08-20/10:39:44
Notice parse_calls does not change
lets execute another query
SQL> select count(*) from dpr70_gl_acct_balance_f;
COUNT(*)
----------
2974
from v$SQL
SQL_TEXT
--------------------------------------------------------------------------------
PARSE_CALLS EXECUTIONS FIRST_LOAD_TIME LOADS LAST_LOAD_TIME
----------- ---------- ------------------- ---------- -------------------
SELECT text from dp_security_text where object_name = :b1
and
comp_group_id = sys_context('dp_comp_group_id_ctx','comp_group_id')
7 24 2003-08-20/09:29:34 2 2003-08-20/10:39:44
Notice again parse_calls does not change
The above SQL is the predicate clause being generated every time
Hope this helps.
Also from Tom Kyte
/QUOTE
Sys_context is treated like a bind variable in a query -- its value is
BOUND in
just like any other value would be.
it rewrites the query which is then sent to the optimizer rewrote the
SYS_CONTEXT calls as bind variables.
/END QUOTE
URL
http://tinyurl.com/knrg
As for the doc below...
> I'll have to do more investigation, since those paragraphs don't clearly
> explain (at least, to me) what is meant by "the same predicate". Does
> that
> mean that predicates with Context Variables included as bind variables
> will
> not be reparsed if their Policy Function was created with
> Static_Policy=True, and yet different sessions can reuse the parsed SQL
> with their own Context values? ...or not?
what this means is in 9i, the policy function will be executed every time
a query is issued against the object.
But if the predicate being is generated is the same everytime then the
policy can be generated with static_policy=true
and if needs to be refreshed, then dbms_policy.refresh needs to be used.
If the predicate generated is different in different database sessions
but they are the same within a session, then
_dynamic_rls_policies=FALSE will prevent it being executed within the
session.
Hope this helps.
Regards,
Sorry for the long winding email
Thanks
Madhavan
http://www.dpapps.com
--
Madhavan Amruthur
DecisionPoint Applications
--
http://www.fastmail.fm - mmm... Fastmail...
--
Please see the official ORACLE-L FAQ: http://www.orafaq.net
--
Author: Madhavan Amruthur
INET: [EMAIL PROTECTED]
Fat City Network Services -- 858-538-5051 http://www.fatcity.com
San Diego, California -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).