注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

fga的一个bug  

2012-11-13 10:05:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

发现fga的一个bug,以下开始做实验:
alter table emp add areacode number;
alter table emp add telephone number;
exec dbms_fga.add_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'scott_emp_audit',audit_column=>'telephone')
truncate table fga_log$;

测试以下sql的审计结果是正常的:
select ename,telephone from emp;  select * from dba_fga_audit_trail;
select count(*) from emp;   select * from dba_fga_audit_trail;
select empno,ename from emp;  select * from dba_fga_audit_trail;

建立以下任何一个索引后,审计结果不再正常:
create index idx_emp_01 on emp(ename||to_char(telephone));
create index idx_emp_01 on emp(empno,to_char(areacode)||to_char(telephone));
create index idx_emp_01 on emp(to_char(telephone)||ename);

以下sql的审计结果均不正常:
select ename,telephone from emp;  select * from dba_fga_audit_trail;
select count(*) from emp;   select * from dba_fga_audit_trail;
select empno,ename from emp;  select * from dba_fga_audit_trail;

而看这些sql的执行计划并没有涉及到被审计列,也就是这些sql不该被审计出来。
SQL> set autot trace exp
SQL> select count(*) from emp;

Execution Plan
----------------------------------------------------------
Plan hash value: 2937609675

-------------------------------------------------------------------
| Id  | Operation        | Name   | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT |        |     1 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE  |        |     1 |            |          |
|   2 |   INDEX FULL SCAN| PK_EMP |    14 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------


SQL> select empno,ename from emp;

Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   140 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   140 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

以下两个索引不会导致fga出现问题:
create index idx_emp_02 on emp(ename,telephone);
create index idx_emp_03 on emp(ename||job);

结论:1.索引中含有审计列,并且在索引中审计列跟其他列拼接时,pga的bug出现,审计出的sql跟dbms_fga.add_policy中没有加audit_column选项时一样。
          2.区号和电话号这两列,在业务中一般是作为一列来处理,所以建了to_char(areacode)||to_char(telephone))这样的索引,其实表设计时完全可以不遵守第一范式,把区号和电话号设计为一列,也就不会需要这种连接索引,同时也就不会触发fga的这个bug。


回滚:
exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'scott_emp_audit')
drop index idx_emp_01;
drop index idx_emp_02;
drop index idx_emp_03;
alter table emp drop column areacode;
alter table emp drop column telephone;

  评论这张
 
阅读(144)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018