问题描述
我必须为特定列创建具有多个值的Oracle FGA策略,例如。一个临时表,它有stat列,数据是('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o')和我要从审核策略创建时排除stat ='a'或'b',但当我更新策略谓词时,它给出“ora-28138错误”
开始
DBMS_FGA.ADD_POLICY(
对象=>'Scott',
对象名称=>'临时',
policy_name =>'Salary_change',
audio_列=>'stat',
audit_条件=>'stat<>''a''或stat <>''b''',
启用=>真,
语句类型=>'UPDATE',
稽核_track => DBMS_FGA.DB + DBMS_FGA.EXTED );
结束;
无法更新下面的错误“or-28138错误在策略谓词中”
更新温度设置sal =5500 ,其中stat ='a';
更新温度设置sal = 5500 ,其中stat ='b';
更新温度设置sal = 5500 ,其中stat ='c';
请引导,谢谢。
开始
DBMS_FGA.ADD_POLICY(
对象=>'Scott',
对象名称=>'临时',
policy_name =>'Salary_change',
audio_列=>'stat',
audit_条件=>'stat<>''a''或stat <>''b''',
启用=>真,
语句类型=>'UPDATE',
稽核_track => DBMS_FGA.DB + DBMS_FGA.EXTED );
结束;
无法更新下面的错误“or-28138错误在策略谓词中”
更新温度设置sal =5500 ,其中stat ='a';
更新温度设置sal = 5500 ,其中stat ='b';
更新温度设置sal = 5500 ,其中stat ='c';
请引导,谢谢。
专家解答
从文档中:
http://docs.oracle.com/database/121/ARPLS/d_fga.htm#ARPLS015
------------------------------------
审计条件必须是布尔表达式,可以使用正在插入、更新或删除的行中的值进行计算。表达式还可以使用函数,如用户函数或SYS_CONTEXT函数。
表达式不能使用AND和OR等运算符组合条件。审计条件可以为NULL (或省略) ,这被解释为TRUE ,但它不能包含以下元素:
子查询或序列
当使用SYS_CONTEXT函数访问时,将使用以下属性:
当前SQL
当前SQL_LENGTH
当前绑定
对伪列的任何使用。
为实现此目的,不再需要指定审计条件“1=1”以强制审计影响指定列的所有指定语句(“语句类型”) (“审计_列”)。即使未处理任何行,也会发生审计,因此,对具有此策略的表的所有操作都会进行审计。
------------------------------------
所以你需要为你的表达想出其他的选择
http://docs.oracle.com/database/121/ARPLS/d_fga.htm#ARPLS015
------------------------------------
审计条件必须是布尔表达式,可以使用正在插入、更新或删除的行中的值进行计算。表达式还可以使用函数,如用户函数或SYS_CONTEXT函数。
表达式不能使用AND和OR等运算符组合条件。审计条件可以为NULL (或省略) ,这被解释为TRUE ,但它不能包含以下元素:
子查询或序列
当使用SYS_CONTEXT函数访问时,将使用以下属性:
当前SQL
当前SQL_LENGTH
当前绑定
对伪列的任何使用。
为实现此目的,不再需要指定审计条件“1=1”以强制审计影响指定列的所有指定语句(“语句类型”) (“审计_列”)。即使未处理任何行,也会发生审计,因此,对具有此策略的表的所有操作都会进行审计。
------------------------------------
所以你需要为你的表达想出其他的选择
SQL> create table t as
2 select e.*,'a' stat
3 from scott.emp e
4 union all
5 select e.*,'b' stat
6 from scott.emp e
7 union all
8 select e.*,'c' stat
9 from scott.emp e
10 /
Table created.
SQL> grant all on t to scott;
Grant succeeded.
SQL> begin
2 DBMS_FGA.ADD_POLICY(
3 object_schema => user,
4 object_name => 'T',
5 policy_name => 'SALARY_CHANGE',
6 audit_column => 'STAT',
7 audit_condition => q'{regexp_count(STAT,'(a|b)')=0}',
8 enable => TRUE,
9 statement_types => 'UPDATE',
10 audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED );
11 end;
12 /
PL/SQL procedure successfully completed.
SQL> conn scott/tiger
Connected.
SQL> update mcdonac.t set sal = 5500 where stat = 'a';
14 rows updated.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




