上一页  下一页          目录  索引  定位  词汇表  程序库

R11 审计线索表、触发器和视图

在第一次启用审计时,将按照与已审计表相同的 Oracle 标识自动创建作为已审计表的影象表。影象表仅包含要审计的列,影象表中的所有列均不受约束,无论它们在要审计的表中处于何种状态。

例如,影象表中始终允许存在“空”。影象表中所有列的数据类型和大小均与已审计表中的计数部分相同。

影象表的名称由原始表名的 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)

审计触发器和过程

在启用审计时,已审计表上的“After”事件的自动生成数据库触发器将执行审计。

此触发器将调用存储的过程,对每一正在审计的列进行比较,以查看其值是否已更改。如果是这样,此过程会将上一个(旧)值保存到影象表。

审计根据此表为每一已审计的事务处理在影象表中创建一个行;这样,影象表中的单个行表示了事务处理中的所有已更改列的所有旧值。

由于表中一个“空”仅使用一个字节,因此数据未进行压缩,在“空”处于影象表(“稀疏”格式)中时,“审计线索”表示所有未更改的值。

审计触发器名称包含已审计表名称的前 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)

数据如何在表和视图中显示

以下是在进行一系列更改之后,数据如何在您的原有表、影象表和审计视图中显示的实例(开始为空白的 AUDIT_DEMO 表)。

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

更改审计表

您可以在开始对表进行审计时,将列添加至影象表。但是,影象表不会跟踪在添加列之前所作的更改。如果您添加,则必须重新运行“审计线索更新表报表”以执行以下操作:

另请参阅

用户和数据审计概览

报告审计线索数据

设置 R11 审计线索

报告 R11 审计信息

禁用审计线索并存档审计数据

审计安装

审计组

审计表


         上一页  下一页          目录  索引  定位  词汇表  程序库