从oracle表

时间:2017-06-08 09:17:47

标签: oracle

数据库版本:11.2.0.4 OS Solaris 5.10

要求:仅在查找是否正在访问记录之后,从表中删除未使用的记录。

我们有一个表员工,有100,000条记录,如果有人从员工表中选择特定记录/记录,那么相应记录的STATUS列应该更新为“ACTIVE”值。

这是审计目的所必需的,60天后我们将删除其STATUS列值为NULL的employee表中的所有记录。怎么能实现呢?

到目前为止我的理解,如果我错了,请纠正我:

1)由于没有SELECT事件,不能使用触发器,我们只有UPDATE,INSERT,DELETE事件。 2)Oracle FGA(细粒度审计)可能无法解决问题。或者我可能不知道,FGA是否可行?

表:

CREATE TABLE EMPLOYEE
(
  EMPID   NUMBER,
  NAME    VARCHAR2(20 BYTE),
  SALARY  NUMBER,
  DEPART  VARCHAR2(100 BYTE),
  STATUS  VARCHAR2(100 BYTE)
)

样本记录:

     EMPID NAME                SALARY DEPART               STATUS    
---------- --------------- ---------- -------------------- ----------
       101 ALFA                  1000 IT                             
       102 BETA                  2000 CLERK                          
       103 PETER                 3000 FINANCE                        
       104 JOHN                  4000 IT                             
       105 MESSI                 5000 TECH                           
       106 ROMEO                 5000 TECH                           
       107 TERI                  5000 TECH                           
       108 ROBERT                5000 TECH                           

示例:

如果下面的任何一个问题陈述

查询1:SELECT * from EMPLOYEE where name='MESSI';

审核应该更新empid = 105

的STATUS ='ACTIVE'
     EMPID NAME                SALARY DEPART               STATUS    
---------- --------------- ---------- -------------------- ----------
       101 ALFA                  1000 IT                             
       102 BETA                  2000 CLERK                          
       103 PETER                 3000 FINANCE                        
       104 JOHN                  4000 IT                             
       105 MESSI                 5000 TECH                 'ACTIVE'                         
       106 ROMEO                 5000 TECH                           
       107 TERI                  5000 TECH                           
       108 ROBERT                5000 TECH                 

查询2:SELECT * from EMPLOYEE where DEPART='TECH';

审核应该更新STATUS ='ACTIVE'for empid = 105,106,107,108

     EMPID NAME                SALARY DEPART               STATUS    
---------- --------------- ---------- -------------------- ----------
       101 ALFA                  1000 IT                             
       102 BETA                  2000 CLERK                          
       103 PETER                 3000 FINANCE                        
       104 JOHN                  4000 IT                             
       105 MESSI                 5000 TECH                 'ACTIVE'                         
       106 ROMEO                 5000 TECH                 'ACTIVE'                                                    
       107 TERI                  5000 TECH                 'ACTIVE'                                                    
       108 ROBERT                5000 TECH                 'ACTIVE'          

3 个答案:

答案 0 :(得分:0)

Oracle建议实现所需的解决方案称为ILM或信息生命周期管理。 它允许您根据某些标准(例如上次访问)存档,删除,移动或执行特定操作。

但请注意,它需要额外的许可证。

我有一个建议:

  1. 在目标表上启用SELECT审核
  2. 创建一个AFTER INSERT TRIGGER,如果OBJECT_NAME是您的表(+其他支票),将在DBA_AUDIT_TRAIL中提取插入行并提取SQL_TEXT
  3. 在此触发器内,执行一些字符串操作以获取WHERE CONDITION&用它来更新。

答案 1 :(得分:0)

对我来说听起来像是一个模棱两可的要求。如果选择*或选择计数(*)会发生什么?根据规范,将使用所有员工记录。 视图v $ SQL将包含发出的“所有”SQL语句,您可以随时查看(通过对象的v $ plan_table)。如果记录被触摸,则使用它们进行逆向工程。

答案 2 :(得分:0)

您可以使用DBMS_FGA包尝试FGA(细粒度审计)。尝试在架构中运行下面的代码块。如果成功执行,请在运行select查询时检查DBA_COMMON_AUDIT_TRAIL或DBA_AUDIT_STATEMENT表(检查文档)中是否定期提交审核。安排定期运行的程序以检查审计表并相应地更新状态列。我从未尝试过这样的事情,但是!。

BEGIN
                   dbms_fga.Add_policy(object_schema => 'HR', object_name => 'EMPLOYEE',
                   policy_name => 'STATUS_UPDATE', audit_condition => 'SELECT',
                   audit_column => 'NAME ,DEPART', handler_schema => NULL,
                   handler_module => NULL,
                   ENABLE => TRUE);
               END;

               /