0

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

命令(作为用户 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;
/

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

4

1 回答 1

4

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

之后,您将拥有一个触发器,该触发器在 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)创建一个用户来托管您的应用程序的对象,然后以该用户的身份连接以构建表、触发器和您需要的任何其他内容。

于 2021-03-07T08:45:24.380 回答