【发布时间】:2017-11-09 22:09:03
【问题描述】:
数据库版本:11.2.0.4 操作系统 Solaris 5.10
要求:只有在确定记录是否被访问后才从表中删除未使用的记录。
我们有一个表employee,它有100,000 条记录,如果有人从employee 表中选择一个特定的记录/记录,则相应记录的STATUS 列应更新为“ACTIVE”值。
这是审计目的所必需的,60 天后我们将删除员工表中 STATUS 列值为 NULL 的所有记录。如何做到这一点?
目前的理解,如有错误请指正:
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';
审核应更新 empid=105,106,107,108 的 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 'ACTIVE'
107 TERI 5000 TECH 'ACTIVE'
108 ROBERT 5000 TECH 'ACTIVE'
【问题讨论】:
-
如何判断一条记录是否被“读取”?假设我使用一些过滤器进行查询,该查询获得 3 条记录,但 Oracle 对表进行了全面扫描,从而“读取”了所有记录;在这种情况下该怎么办?或者,如果尝试获取 N 记录的查询,然后我在仅获取 1 行的外部查询中使用它;那该怎么办?
-
您可以使用 FGA 来触发审计,并且在策略创建中,您可以调用您创建的过程。在该过程中,进行所需的更改。
标签: oracle