为什么我不需要在数据库触发器中提交?

Cen*_*ion 7 trigger oracle

我们不能在 DML 触发器中 COMMIT/ROLLBACK,因为事务是在 DML 语句之后手动处理的。然而,数据库触发器似乎是一个例外。例如,假设有一个数据库触发器:

CREATE OR REPLACE TRIGGER user_login_as
  AFTER LOGON 
    ON SCHEMA
BEGIN
  INSERT INTO user_login_log(username, log_date, action) VALUES (user, sysdate, 'User has logged in');
END user_login_as;
Run Code Online (Sandbox Code Playgroud)

触发器不包含内部提交的自治事务过程,那么谁在提交插入?这个触发器就像一个魅力,在用户登录后将新记录插入到日志表中。它闻起来像隐藏的 Oracle 功能,我在 Oracle 文档中找不到任何关于此的参考。我正在使用 Oracle11g。

Mat*_*Mat 13

您会自动获得这些触发器的自治事务上下文。

CREATE TRIGGER文档:

可能导致触发器触发的数据库的一种或多种特定状态。除非另有说明,否则您可以在 DATABASE 或 SCHEMA 上为这些事件创建触发器。对于这些触发事件中的每一个,数据库打开一个自治事务范围,触发触发器,并提交任何单独的事务(不管任何现有的用户事务)。

如果触发器失败会发生什么取决于确切的触发器/事件。请参阅触发器中的异常处理。特别是,因异常而失败的登录触发器很可能会锁定非 dba 用户 - 除非用户具有特定权限,否则异常会使登录失败。