create or replace function auditif
return number as
l_filter_count NUMBER;
begin
EXECUTE IMMEDIATE 'EXPLAIN PLAN FOR ' || SYS_CONTEXT('USERENV','CURRENT_SQL');
select count(*)
into l_filter_count
from table(dbms_xplan.display(format=>'PREDICATE'))
where (plan_table_output like '% - filter(%' OR plan_table_output like '% - access(%')
and plan_table_output not like '%SYS_AUDIT(%';
dbms_output.put_line(l_filter_count);
if (SUBSTR(UPPER(sys_context('userenv','CLIENT_PROGRAM_NAME')),1,3)='SQL' AND l_filter_count=0)
or
(SUBSTR(UPPER(sys_context('userenv','CLIENT_PROGRAM_NAME')),1,4)='TOAD' AND l_filter_count=0)
then return 1;
else return 0;
end if;
end;
/
I have called this function inside a DBMS_FGA policy for enable audit conditionally
begin
DBMS_FGA.ADD_POLICY(
OBJECT_SCHEMA =>'AIM_DBA',
object_name =>'EMP_DATA_I',
policy_name =>'PROTECT_AIM_DBA_SCHEMA_TABLE',
audit_condition=>'AIM_DBA.AUDITIF=1',
statement_types =>'UPDATE,DELETE');
end;
/
But when running sql statement to check audit policy functionality getting following error:
delete EMP_DATA_I
*
ERROR at line 1:
ORA-00905: missing keyword
ORA-06512: at "AIM_DBA.AUDITIF", line 5