Oracle列是否有自动修改时间戳类型?

时间:2009-10-23 15:32:45

标签: sql oracle

有没有办法在Oracle中创建一个时间戳列,自动存储记录更改时间的时间戳?

6 个答案:

答案 0 :(得分:18)

非常确定您必须使用Oracle中的触发器执行此操作:

create or replace TRIGGER parkedorder_tbiur
   BEFORE INSERT OR UPDATE
   ON parkedorder
   REFERENCING OLD AS old_row NEW AS new_row
   FOR EACH ROW
BEGIN
   IF INSERTING
   THEN
      IF :new_row.ID IS NULL
      THEN
         SELECT parkedorder_seq.NEXTVAL
           INTO :new_row.ID
           FROM DUAL;
      END IF;
   END IF;

   IF    :new_row.lastupdated <> SYSDATE
      OR :new_row.lastupdated IS NULL
   THEN
      SELECT sysdate
        INTO :new_row.lastupdated
        FROM DUAL;
   END IF;

   SELECT SYS_CONTEXT ( 'USERENV', 'OS_USER' )
     INTO :new_row.lastupdatedby
     FROM DUAL;
END;

答案 1 :(得分:15)

是的,通过触发器:

create or replace
TRIGGER schema.name_of_trigger
BEFORE INSERT OR UPDATE ON schema.name_of_table
FOR EACH ROW
BEGIN
    :new.modified_on := SYSTIMESTAMP;
END;

这假设您的表有一个名为modified_on的字段。

如上所述,只要您有多个表更新的不同位置,触发器就是理想的候选者。如果您只有一个可以更新表的函数/过程,只需在那里执行,然后跳过触发器。

答案 2 :(得分:7)

对于oracle,我通常使用触发器来更新时间戳字段

CREATE OR REPLACE TRIGGER update_timestamp 
  BEFORE INSERT OR UPDATE ON some_table
  FOR EACH ROW
BEGIN
  :NEW.TS := systimestamp;
END;

Oracle似乎没有内置属性来将时间戳字段更新为当前时间戳(与MySQL之类的其他数据库不同)。

答案 3 :(得分:6)

通过查询ORA_ROWSCNhttp://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns007.htm#sthref825

,您可以非常接近这一点

如果使用ROWDEPENDENCIES选项创建表,则更准确。

它实际上记录了记录的提交时间......

drop table tester 
/

create table tester (col1 number, col2 timestamp)
rowdependencies
/

insert into tester values (1, systimestamp)
/

(approximate five second pause)

commit
/

select t.ora_rowscn,
       SCN_TO_TIMESTAMP(t.ora_rowscn),
       t.col1,
       t.col2
from   tester t
/

ORA_ROWSCN             SCN_TO_TIMESTAMP(T.ORA_ROWSCN) COL1                   COL2
---------------------- ------------------------------ ---------------------- -------------------------
9104916600628          2009-10-26 09.26.38.000000000  1                      2009-10-26 09.26.35.109848000 

答案 4 :(得分:1)

解决这个问题的另一种方法是启用细粒度审计。各行没有时间戳,但您将拥有所有更改的记录。但是在大多数情况下都是矫枉过正 - 我通常只使用触发器。

如果你没有最近的.01秒,你可以使用日期格式并分配sysdate。如果您需要更多详细信息,请使用时间戳。

答案 5 :(得分:0)

我建模的表总是包括:

  • CREATED_USER VARCHAR2
  • CREATED_DATE DATE
  • UPDATED_USER VARCHAR2
  • UPDATED_DATE DATE

...列。为什么在可以与INSERT / UPDATE同时设置值时实现触发器?

INSERT INTO TABLE (...CREATED_DATE, UPDATED_DATE) VALUES (...,SYSDATE, SYSDATE);

UPDATE TABLE
   SET ...,
       UPDATED_DATE = SYSDATE