我明天将通过一篇关于数据库服务器管理的旧文章,为我的生活做好回答。谁能给我简明的答案或者至少指出我正确的方向?任何帮助是极大的赞赏!
b)审计数据通常通过使用数据库触发器来捕获。 (i)触发器触发后会发生什么? (ii)讨论这将如何影响正常的数据库操作 (6分)
Command (as user SYS):
SQL> CREATE OR REPLACE TRIGGER audit-table-DEPT AFTER
2 INSERT OR UPDATE OR DELETE ON DEPT FOR EACH ROW
3 declare
4 audit_data DEPT$audit%ROWTYPE;
5 begin
6 if inserting then audit_data.change_type := 'I';
7 elsif updating then audit_data.change_type :='U';
8 else audit_data.change_type := 'D';
9 end if;
10
11 audit_data.changed_by := user;
12 audit_data.changed_time := sysdate;
13
14 case audit_data.change_type
15 when 'I' then
16 audit_data.DEPTNO := :new.DEPTNO;
17 audit_data.DNAME := :new.DNAME;
18 audit_data.LOC := :new.LOC;
19 else
20 audit_data.DEPTNO := :old.DEPTNO;
21 audit_data.DNAME := :old.DNAME;
22 audit_data.LOC := :old.LOC;
23 end case;
24
25 insert into DEPT$audit values audit_data;
26 end;
27 /
Trigger created.
答案 0 :(得分:1)
每次在DATA
表中插入,删除或更新某些内容时,触发器都会在审计表中插入新行。
第4行声明了一个新变量audit_data
,它是一个%ROWTYPE
变量,这意味着它将模仿数据库表中的一行,而不是像{{1}那样只保留一个值。 }或INT
会。
第6-9行设置DOUBLE
的{{1}}列的值。如果因为我们在audit_data
中插入一行而调用了触发器,那么change_type
将设置为值DATA
。如果我们要更新change_type
,则I
设置为DATA
。否则,我们将从change_type
删除,U
设置为DATA
。
第11行& 12在change_type
中再设置两列。 D
字段设置为等于执行此插入/更新/删除的用户,audit_data
设置为等于当前时间。
第14-23行然后设置changed_by
的最后三个字段:change_time
,audit_data
和DEPTNO
。这些字段在原始DNAME
表中具有相应的字段。如果我们在LOC
中插入一个新行(我们之前已将DATA
设置为I),那么新DATA
字段的值将是插入{{1}的新值}}。如果我们要更新或删除change_type
中的行,我们会将新audit_data
字段的值设置为来自DATA
的旧的更新前/删除前的值。< / p>
最后,第25行执行实际插入到审计表中,插入一行,其中包含我们刚刚完成设置的所有DATA
值。
答案 1 :(得分:0)
当操作为INSERT
时,触发器会获取新插入的记录的值,并将其存储在DEPT$audit
中。
如果它不是插入(即操作为UPDATE
或DELETE
),则触发器会使用旧值(更新后的旧/当前值)已删除的行)并再次将它们存储在DEPT$audit
中。
这显然是为历史/审计目的而做的。