我们不能在 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 用户 - 除非用户具有特定权限,否则异常会使登录失败。