【问题标题】:Audit-table-DEPT Trigger审计表 DEPT 触发器
【发布时间】:2021-06-05 09:30:20
【问题描述】:

当这个数据库触发器被触发时会发生什么?

命令(作为用户 SYS):

SQL> CREATE OR REPLACE TRIGGER audit-table-DEPT AFTER
INSERT OR UPDATE OR DELETE ON DEPT FOR EACH ROW
declare
audit_data DEPT$audit%ROWTYPE;
begin
if inserting then audit_data.change_type := 'I';
elsif updating then audit_data.change_type :='U';
else audit_data.change_type := 'D';
end if;

audit_data.changed_by := user;
audit_data.changed_time := sysdate;
case audit_data.change_type
when 'I' then
audit_data.DEPTNO := :new.DEPTNO;
audit_data.DNAME := :new.DNAME;
audit_data.LOC := :new.LOC;
else
audit_data.DEPTNO := :old.DEPTNO;
audit_data.DNAME := :old.DNAME;
audit_data.LOC := :old.LOC;
end case;
insert into DEPT$audit values audit_data;
end;
/

这会如何影响正常的数据库操作?

【问题讨论】:

    标签: oracle triggers oracle19c audit-tables


    【解决方案1】:

    如果你运行这个命令会发生什么?没什么,触发器不会编译,因为你给了它一个无效的对象名称。 (用下划线替换那些破折号。)

    之后,您将拥有一个触发器,该触发器在 DEPT 表上插入 DML 活动的审计记录。插入时,您会得到一个 AUDIT_DEPT 记录,其中包含插入的 DEPT 记录的值。删除时,您将获得一条 AUDIT_DEPT 记录,其中包含已删除的 DEPT 记录的值。更新时,您会得到一条有点无用的 AUDIT_DEPT 记录,它会告诉您一条 DEPT 记录已更新,但无法识别是哪条记录。

    这会如何影响正常的数据库操作?

    它不会导致任何事情失败。但是,每次对 DEPT 表执行 DML 时,您都会执行额外的插入语句。您可能不会注意到对单行语句的影响,但是如果您插入、更新或删除大量 DEPT 记录,您可能会注意到响应时间变慢。您需要对其进行基准测试。

    最后一个观察:

    命令(作为用户 SYS):

    哦哦。

    此语句的更好解释是触发器不会编译,因为 SYS 模式没有 DEPT 表。以拥有 DEPT 表的用户身份连接,然后运行 ​​CREATE TRIGGER 语句。

    令人担忧的选项是触发器编译是因为您在其架构中放置了一个 DEPT 表。这是不好的做法。 SYS 模式由 Oracle 维护以运行数据库内部软件。除非经 Oracle 授权,否则更改 SYS 模式可能会损坏您的数据库并使您拥有的任何支持合同无效。您应该做的是使用 SYS(或 SYSTEM)创建一个用户来托管您的应用程序的对象,然后以该用户的身份连接以构建表、触发器和您需要的任何其他内容。

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 2021-09-05
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2017-12-09
      相关资源
      最近更新 更多