Database 即使应用程序崩溃,触发器是否仍保持原子性
我有一种情况,我有两个表,可以执行插入、更新和删除操作。我引入了一个表audit_trail来维护这两个表的更改日志。现在要在audit_trail表中输入值,我在任何更新之后都编写了Insert语句,在其中一个表上删除或插入。现在,如果在其中一个表上发生修改,并且应用程序崩溃,那么基于我的方法,将不会发生审计表插入。因此,我想知道,在插入或更新或删除此表后,我是否在条件上写入触发器,那么即使application crasks.DBMS是Oracle您需要将insert移动到存储过程中,并从audit trail触发器中调用它 在存储过程内部启用自治事务,然后可以在存储过程内部提交,而不影响触发触发器的外部事务 有关详细信息,请参阅手册:Database 即使应用程序崩溃,触发器是否仍保持原子性,database,oracle,triggers,Database,Oracle,Triggers,我有一种情况,我有两个表,可以执行插入、更新和删除操作。我引入了一个表audit_trail来维护这两个表的更改日志。现在要在audit_trail表中输入值,我在任何更新之后都编写了Insert语句,在其中一个表上删除或插入。现在,如果在其中一个表上发生修改,并且应用程序崩溃,那么基于我的方法,将不会发生审计表插入。因此,我想知道,在插入或更新或删除此表后,我是否在条件上写入触发器,那么即使application crasks.DBMS是Oracle您需要将insert移动到存储过程中,并从a
您需要将insert移动到存储过程中,并从audit trail触发器中调用该过程 在存储过程内部启用自治事务,然后可以在存储过程内部提交,而不影响触发触发器的外部事务 有关详细信息,请参阅手册:
这是为数不多的、可能是唯一的有效使用。这允许我们在离散事务中发出SQL,这意味着在不影响更广泛事务的情况下提交内容。因此,即使在用户发出显式提交或其他命令之前数据库崩溃,也会提交审核消息 显然,我不知道您要记录什么数据,但请编写一个这样的过程,并从触发器调用它:
procedure write_audit
(p_table_name in audit_table.table_name%type
, p_action in audit_table.action%type )
is
pragma autonomous_transaction;
begin
insert into audit_table
(id, table_name, ts, action)
values
(audit_id.nextval, p_table_name, systimestamp, p_action);
commit;
end write_audit;
这是为数不多的,可能是唯一的,有效的使用。这允许我们在离散事务中发出SQL,这意味着在不影响更广泛事务的情况下提交内容。因此,即使在用户发出显式提交或其他命令之前数据库崩溃,也会提交审核消息 显然,我不知道您要记录什么数据,但请编写一个这样的过程,并从触发器调用它:
procedure write_audit
(p_table_name in audit_table.table_name%type
, p_action in audit_table.action%type )
is
pragma autonomous_transaction;
begin
insert into audit_table
(id, table_name, ts, action)
values
(audit_id.nextval, p_table_name, systimestamp, p_action);
commit;
end write_audit;
你的问题意味着你不想保持原子性。原子性意味着要么提交整个事务,要么不提交任何事务。听起来您希望audit_trail记录所有I/U/D尝试,而不仅仅是成功的尝试。不,我想知道的是,如果在其他两个表上插入、删除、更新成功,那么即使应用程序崩溃了audit trail以获得该条目。您的问题意味着您不想维护原子性。原子性意味着要么提交整个事务,要么不提交任何事务。听起来您希望audit_trail记录所有I/U/D尝试,而不仅仅是成功的尝试。不,如果在其他两个表上插入、删除、更新成功,那么即使应用程序崩溃了audit trail,也要记录该条目。