![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|
上一页 | 下一页 | 目录 | 索引 | 定位 | 词汇表 | 程序库 |
例如,影象表中始终允许存在“空”。影象表中所有列的数据类型和大小均与已审计表中的计数部分相同。
影象表的名称由原始表名的 26 个字符加上后缀“_A”(审计)组成。
SQL> DESCRIBE AUDIT_DEMO NAME NULL? TYPE ------------------------------- -------- ---- PRIMARY_KEY NUMBER(5) VALUE_ONE VARCHAR2(5) VALUE_TWO VARCHAR2(5) VALUE_THREE VARCHAR2(5)
其影象表如下(假设您审计了所有表列):
SQL> DESCRIBE AUDIT_DEMO_A NAME NULL? TYPE ------------------------------- -------- ---- AUDIT_TIMESTAMP NOT NULL DATE AUDIT_TRANSACTION_TYPE NOT NULL VARCHAR2(1) AUDIT_USER_NAME NOT NULL VARCHAR2(100) AUDIT_TRUE_NULLS VARCHAR2(250) PRIMARY_KEY NUMBER VALUE_ONE VARCHAR2(5) VALUE_TWO VARCHAR2(5) VALUE_THREE VARCHAR2(5)
此触发器将调用存储的过程,对每一正在审计的列进行比较,以查看其值是否已更改。如果是这样,此过程会将上一个(旧)值保存到影象表。
审计根据此表为每一已审计的事务处理在影象表中创建一个行;这样,影象表中的单个行表示了事务处理中的所有已更改列的所有旧值。
由于表中一个“空”仅使用一个字节,因此数据未进行压缩,在“空”处于影象表(“稀疏”格式)中时,“审计线索”表示所有未更改的值。
审计触发器名称包含已审计表名称的前 26 个字符加上“_AI”、“_AU”或“_AD”,其中 I、U 或 D 分别表示插入、更新或删除。同样,审计过程名使用表名称的前 26 个字符加上“_AIP”、“_AUP”或“_ADP”。表名称的前 26 个字符必须唯一。
视图名称包含已审计表名的前 26 个字符加上“_AC#”或“_AV#”,此处的 C 或 V 表示视图的类型,# 表示编号。由于创建大小的限制,影象表列可能需要分为多个视图,并且依次进行编号。
每个视图对数据的访问可以略有不同。一个视图 (_AC) 允许用户在给定的时间重建行值,而另一视图 (_AV) 则在更改值时提供简单访问。
在实例表中,_AV1 和 _AC1 视图的创建如下:
SQL> DESCRIBE AUDIT_DEMO_AV1 NAME NULL? TYPE ------------------------------- -------- ---- AUDIT_TIMESTAMP DATE AUDIT_TRANSACTION_TYPE VARCHAR2(1) AUDIT_USER_NAME VARCHAR2(100) AUDIT_TRUE_NULLS VARCHAR2(250) PRIMARY_KEY NUMBER VALUE_ONE VARCHAR2(5) VALUE_TWO VARCHAR2(5) VALUE_THREE VARCHAR2(5)
SQL> DESCRIBE AUDIT_DEMO_AC1 NAME NULL? TYPE ------------------------------- -------- ---- AUDIT_TIMESTAMP DATE AUDIT_TRANSACTION_TYPE VARCHAR2(1) AUDIT_USER_NAME VARCHAR2(100) PRIMARY_KEY NUMBER VALUE_ONE VARCHAR2(5) VALUE_TWO VARCHAR2(5) VALUE_THREE VARCHAR2(5)
SQL> INSERT INTO AUDIT_DEMO VALUES (1,'A','A','A'); SQL> INSERT INTO AUDIT_DEMO VALUES (2,'X','X','X'); SQL> SELECT PRIMARY_KEY KEY, VALUE_ONE VAL_1, VALUE_TWO VAL_2, VALUE_THREE VAL_3 FROM AUDIT_DEMO; KEY VAL_1 VAL_2 VAL_3 ---- ----- ----- ----- 1 A A A 2 X X X
SQL> UPDATE AUDIT_DEMO SET VALUE_ONE ='B' WHERE PRIMARY_KEY = 1; KEY VAL_1 VAL_2 VAL_3 ---- ----- ----- ----- 1 B A A 2 X X X
SQL> UPDATE AUDIT_DEMO SET VALUE_TWO ='B' WHERE PRIMARY_KEY = 1; KEY VAL_1 VAL_2 VAL_3 ---- ----- ----- ----- 1 B B A 2 X X X SQL> UPDATE AUDIT_DEMO SET VALUE_THREE ='B' WHERE PRIMARY_KEY = 1; SQL> UPDATE AUDIT_DEMO SET VALUE_ONE ='Y' WHERE PRIMARY_KEY = 2; SQL> UPDATE AUDIT_DEMO SET VALUE_ONE = NULL WHERE PRIMARY_KEY = 1; SQL> UPDATE AUDIT_DEMO SET VALUE_ONE ='C' WHERE PRIMARY_KEY = 1;
在两次插入和六次更新后,已审计表中的最后值为:
KEY VAL_1 VAL_2 VAL_3 ---- ----- ----- ----- 1 C B B 2 Y X X
相应影象表中的最后值如下所示。影象表中的行表示已审计行在更改前的状态。请注意,如果行中的值在进行事务处理期间未更改,影象表将在此事务处理中为此值记录空白。
在此实例中,影象表中的前两行表示在插入已审计的两行之前没有数据的状态。两个插入事务处理(I 类)行的“优先值”为“空”值。同样,在将行 1 的第一个值 A 更新为值 B 时,影象表将在其第三行记录值 A:
SQL> SELECT TO_CHAR(AUDIT_TIMESTAMP, 'HH24:MI:SS') TIME, AUDIT_TRANSACTION_TYPE TYPE, AUDIT_USER_NAME NAME, PRIMARY_KEY KEY, VALUE_ONE VAL_1, VALUE_TWO VAL_2, VALUE_THREE VAL_3, AUDIT_TRUE_NULLS FROM AUDIT_DEMO_A; TIME TYPE NAME KEY VAL_1 VAL_2 VAL_3 AUDIT_TRUE_NULLS -------- ---- ------ ---- ----- ----- ----- ---------------- 11:08:16 I FND60 1 11:08:40 I FND60 2 11:18:40 U FND60 1 A 11:20:12 U FND60 1 A 11:21:54 U FND60 1 A 11:22:15 U FND60 2 X 14:20:50 U FND60 1 B 14:21:15 U FND60 1 NYNN 8 rows selected.
在给定已审计表行的当前值时,您可以通过从影象表相应的行进行备份,以跟踪对此行所做的更改。
在此实例表中,我们做了两个插入事务处理和六个更新事务处理,因此可以在影象表中查看这八个事务处理。在最后一行中,NYNN 表示第二个表列中的值 (VALUE_ONE) 已由实际“空”值 (Y) 发生更改,而不是未更改的值(在影象表中以“空”表示)。
以下两个视图提供进一步检查已审计数据的方法。
在视图中,具有 C 类事务处理的行表示在已选定数据时行的当前值(由于视图是影象表与已审计表之间的连接点,因此当前值行将反映已审计表的当前状态)。
_AC 视图提供数据的“已填充”版本,此视图中将显示未更改的值,而不是由空白值代替。您可以按主关键字(而不是按时间标记)排列此视图的顺序,因此影象表中对应单个已审计行的所有行将一起显示,并按时间标记进行二级排序。
SQL> SELECT TO_CHAR(AUDIT_TIMESTAMP, 'HH24:MI:SS') TIME, AUDIT_TRANSACTION_TYPE TYPE, AUDIT_USER_NAME NAME, PRIMARY_KEY KEY, VALUE_ONE VAL_1, VALUE_TWO VAL_2, VALUE_THREE VAL_3 FROM AUDIT_DEMO_AC1 ORDER BY PRIMARY_KEY, AUDIT_TIMESTAMP; TIME TYPE NAME KEY VAL_1 VAL_2 VAL_3 -------- ---- ---------- ---- ----- ----- ----- 11:08:16 I FND60 1 A A A 11:18:40 U FND60 1 B A A 11:20:12 U FND60 1 B B A 11:21:54 U FND60 1 B B B 14:20:50 U FND60 1 B B 14:21:15 U FND60 1 C B B 17:53:34 C 1 C B B 11:08:40 I FND60 2 X X X 11:22:15 U FND60 2 Y X X 17:53:34 C 2 Y X X 10 rows selected.
注意:如果对已审计表的更改每秒钟超过了一次(也就是说,快于由 SYSDATE 提供的一秒粒度),由于 _AC 视图中使用的连接,您可以在此视图中查看每个事务处理的多个记录的“模糊点”。但是,此影象表本身保留了对事务处理的更正,因此您可以直接使用影象表解决这些事务处理。
_AV1 视图是一种按时间标记排列的更稀疏的审计数据视图:
SQL> SELECT TO_CHAR(AUDIT_TIMESTAMP, 'HH24:MI:SS') TIME, AUDIT_TRANSACTION_TYPE TYPE, AUDIT_USER_NAME NAME, PRIMARY_KEY KEY, VALUE_ONE VAL_1, VALUE_TWO VAL_2, VALUE_THREE VAL_3, AUDIT_TRUE_NULLS FROM AUDIT_DEMO_AV1; TIME TYPE NAME KEY VAL_1 VAL_2 VAL_3 AUDIT_TRUE_NULLS -------- ---- ------ ---- ----- ----- ----- ---------------- 11:08:16 I FND60 1 11:08:40 I FND60 2 11:18:40 U FND60 1 A 11:20:12 U FND60 1 A 11:21:54 U FND60 1 A 11:22:15 U FND60 2 X 14:20:50 U FND60 1 B 14:21:15 U FND60 1 NYNN 17:58:31 C 1 C B B 17:58:31 C 2 Y X X 10 rows selected.
以下是如何使用视图来确定由何人在何时更改特定值的实例:
SQL> SELECT TO_CHAR(AUDIT_TIMESTAMP, 'HH24:MI:SS') TIME, AUDIT_TRANSACTION_TYPE TYPE, AUDIT_USER_NAME NAME FROM AUDIT_DEMO_AV1 WHERE PRIMARY_KEY = 1 AND VALUE_ONE = 'B'; TIME TYPE NAME -------- ---- ------ 14:20:50 U FND60
同样,您可能需要确定由何人在何时将值更改为“空”:
SQL> SELECT TO_CHAR(AUDIT_TIMESTAMP, 'HH24:MI:SS') TIME, AUDIT_TRANSACTION_TYPE TYPE, AUDIT_USER_NAME NAME FROM AUDIT_DEMO_AV1 WHERE PRIMARY_KEY = 1 AND VALUE_ONE IS NULL AND SUBSTR(AUDIT_TRUE_NULLS,2,1) = 'Y'; TIME TYPE NAME -------- ---- ------ 14:21:15 U FND60
上一页 | 下一页 | 目录 | 索引 | 定位 | 词汇表 | 程序库 |