Sql oracle中单个事务中不同DML查询的不同时间戳
我在单个事务中对表执行插入和删除操作。我在此表上有更新日志的触发器。日志的主键为sequenceId,插入时总是递增。我先删除,然后在事务中插入 我有两个问题: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)。如何确保日志中的顺序一致(删除后插入)
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