SQL触发过去的论文

时间:2016-05-09 15:17:27

标签: sql oracle plsql triggers

我明天将通过一篇关于数据库服务器管理的旧文章,为我的生活做好回答。谁能给我简明的答案或者至少指出我正确的方向?任何帮助是极大的赞赏!

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. 

2 个答案:

答案 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_timeaudit_dataDEPTNO。这些字段在原始DNAME表中具有相应的字段。如果我们在LOC中插入一个新行(我们之前已将DATA设置为I),那么新DATA字段的值将是插入{{1}的新值}}。如果我们要更新或删除change_type中的行,我们会将新audit_data字段的值设置为来自DATA的旧的更新前/删除前的值。< / p>

最后,第25行执行实际插入到审计表中,插入一行,其中包含我们刚刚完成设置的所有DATA值。

答案 1 :(得分:0)

当操作为INSERT时,触发器会获取新插入的记录的值,并将其存储在DEPT$audit中。

如果它不是插入(即操作为UPDATEDELETE),则触发器会使用旧值(更新后的旧/当前值)已删除的行)并再次将它们存储在DEPT$audit中。

这显然是为历史/审计目的而做的。