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).

Reply via email to