有没有办法在Oracle中创建一个时间戳列,自动存储记录更改时间的时间戳?
答案 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_ROWSCN
:http://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