Sql oracle中单个事务中不同DML查询的不同时间戳

Sql oracle中单个事务中不同DML查询的不同时间戳,sql,oracle,commit,dml,Sql,Oracle,Commit,Dml,我在单个事务中对表执行插入和删除操作。我在此表上有更新日志的触发器。日志的主键为sequenceId,插入时总是递增。我先删除,然后在事务中插入 我有两个问题: 日志中插入和删除的时间戳相同。我能强迫它不同吗 日志中的操作顺序(插入/删除)正在颠倒。它显示插入操作之后的删除操作(根据sequenceId)。如何确保日志中的顺序一致(删除后插入) 例如: create table address (ID number, COUNTRY char(2)); create table addre

我在单个事务中对表执行插入和删除操作。我在此表上有更新日志的触发器。日志的主键为sequenceId,插入时总是递增。我先删除,然后在事务中插入

我有两个问题:

  • 日志中插入和删除的时间戳相同。我能强迫它不同吗
  • 日志中的操作顺序(插入/删除)正在颠倒。它显示插入操作之后的删除操作(根据sequenceId)。如何确保日志中的顺序一致(删除后插入)
例如:

create table address (ID number, COUNTRY char(2));

create table address_log(SEQ_ID number, ID number, COUNTRY char(2), DML_TYPE char(1), CHANGE_DATE timestamp(6));

create sequence seq_id start with 1 increment by 100 nominvalue nomaxvalue cache 20 noorder;

create or replace trigger trg_add
before insert or delete on address
FOR EACH ROW
BEGIN
if inserting then
  insert into address_log values(SEQ_ID.nextval, :new.ID, :new.COUNTRY, 'I', sysdate);
else
  insert into address_log values(SEQ_ID.nextval, :old.ID, :old.COUNTRY, 'D', sysdate);
end if;
end;

insert into address values(1,'US');
insert into address values(2,'CA');
delete from address where id = 1;
insert into address values(3,'UK');
delete from address where id = 3;

如果我在单个事务中提交最后一个DML查询,那么我应该在地址日志中看到相同的顺序。

时间戳列的数据类型是什么

如果使用的精度足够高,则应保留顺序

例如
时间戳(6)
(精确到微秒)--这是默认精度:

SQL> CREATE TABLE t_data (ID NUMBER, d VARCHAR2(30));

Table created

SQL> CREATE TABLE t_log (ts TIMESTAMP (6), ID NUMBER, action VARCHAR2(1));

Table created

SQL> CREATE OR REPLACE TRIGGER trg
  2     BEFORE INSERT ON t_data
  3     FOR EACH ROW
  4  BEGIN
  5     INSERT INTO t_log VALUES (systimestamp, :NEW.id, 'I');
  6  END;
  7  /

Trigger created

SQL> INSERT INTO t_data (SELECT ROWNUM, 'x' FROM dual CONNECT BY LEVEL <= 10);

10 rows inserted

SQL> SELECT * FROM t_log ORDER BY ts;

TS                                    ID ACTION
----------------------------- ---------- ------
19/06/13 15:47:51,686192               1 I
19/06/13 15:47:51,686481               2 I
19/06/13 15:47:51,686595               3 I
19/06/13 15:47:51,686699               4 I
19/06/13 15:47:51,686800               5 I
19/06/13 15:47:51,686901               6 I
...

这将允许您拥有可靠的排序顺序,即使事件同时发生。

@wolφi我使用日志的主键sequenceId来确定它。它总是递增。还更新了问题。感谢您的代码示例。所以,这两个问题都已经由@Vincent的答案解决了,不是吗?(提示:如果您接受它,Vincent和您都会得到一些分数…)时间戳的数据类型是timestamp(6)。插入和删除发生在同一个提交中,并且都具有相同的时间戳。@rajsekhar如您在我的示例中所见,
SYSTIMESTAMP
不是在提交时决定的,而是在插入期间决定的。触发器不可能总是以相同的微秒执行。请用再现所述行为的示例修改您的问题。使用create语句、触发器代码、insert语句和select语句。我想使用SYSDATE而不是SYSTIMESTAMP是有区别的。我有这个DML:insert到POC_TEST_TIPOS(TDATE、TTIMESTAMP)值(到日期('2009/05/25 15:33:08','yyyy/mm/dd hh24:mi:ss'),4到日期('2009/09/07 15:33:08','yyyy/mm/dd hh24:ss');我认为插入时间戳值是错误的?@Kiquenet这与当前问题无关,请打开另一个问题。
CREATE SEQUENCE log_sequence ORDER