Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 即使应用程序崩溃,触发器是否仍保持原子性_Database_Oracle_Triggers - Fatal编程技术网

Database 即使应用程序崩溃,触发器是否仍保持原子性

Database 即使应用程序崩溃,触发器是否仍保持原子性,database,oracle,triggers,Database,Oracle,Triggers,我有一种情况,我有两个表,可以执行插入、更新和删除操作。我引入了一个表audit_trail来维护这两个表的更改日志。现在要在audit_trail表中输入值,我在任何更新之后都编写了Insert语句,在其中一个表上删除或插入。现在,如果在其中一个表上发生修改,并且应用程序崩溃,那么基于我的方法,将不会发生审计表插入。因此,我想知道,在插入或更新或删除此表后,我是否在条件上写入触发器,那么即使application crasks.DBMS是Oracle您需要将insert移动到存储过程中,并从a

我有一种情况,我有两个表,可以执行插入、更新和删除操作。我引入了一个表audit_trail来维护这两个表的更改日志。现在要在audit_trail表中输入值,我在任何更新之后都编写了Insert语句,在其中一个表上删除或插入。现在,如果在其中一个表上发生修改,并且应用程序崩溃,那么基于我的方法,将不会发生审计表插入。因此,我想知道,在插入或更新或删除此表后,我是否在条件上写入触发器,那么即使application crasks.DBMS是Oracle

您需要将insert移动到存储过程中,并从audit trail触发器中调用它

在存储过程内部启用自治事务,然后可以在存储过程内部提交,而不影响触发触发器的外部事务

有关详细信息,请参阅手册:

您需要将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,也要记录该条目。