数据库版本: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'
答案 0 :(得分:0)
Oracle建议实现所需的解决方案称为ILM或信息生命周期管理。 它允许您根据某些标准(例如上次访问)存档,删除,移动或执行特定操作。
但请注意,它需要额外的许可证。
我有一个建议:
答案 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;
/