1

我正在单个事务中对表执行插入和删除操作。我在此表上触发了更新日志。日志的主键为 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 查询,那么我应该在 address_log 中看到相同的顺序。

4

1 回答 1

3

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

如果您使用TIMESTAMP足够大的精度,则应保留顺序。

例如TIMESTAMP(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
...

在任何情况下,如果您真的想区分同时发生的事件(例如并发插入),您总是可以另外使用一个序列,并使用ORDER关键字来保证行将被排序:

CREATE SEQUENCE log_sequence ORDER

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

于 2013-06-19T13:51:38.810 回答