Есть ли способ создать столбец timestamp в Oracle, который автоматически сохраняет метку времени, когда запись изменилась?
Существует ли тип времени автоматической модификации для столбцов Oracle?
Ответ 1
Таблицы, которые я смоделировал, всегда включают в себя:
-
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
Ответ 2
Довольно уверен, что вам нужно сделать это с помощью триггера в 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;
Ответ 3
Да, с помощью триггера:
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.
Как уже отмечалось выше, триггер является идеальным кандидатом в любое время, когда у вас есть несколько разных мест, где таблица обновляется. Если у вас есть только одна функция/процедура, которая может обновить таблицу, просто сделайте ее там и пропустите триггер.
Ответ 4
Это интересный вопрос. Для oracle я обычно использую триггер для обновления поля метки времени
CREATE OR REPLACE TRIGGER update_timestamp
BEFORE INSERT OR UPDATE ON some_table
BEGIN
:NEW.TS := systimestamp;
END;
Oracle, похоже, не имеет встроенного атрибута для обновления поля временной метки к текущей временной отметке (в отличие от других БД, таких как MySQL).
Ответ 5
Вы можете приблизиться к этому, запросив 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
Ответ 6
Еще один способ справиться с этим - включить мелкомасштабный аудит. Отдельные строки не будут иметь метки времени, но у вас будет запись всех изменений. Overkill в большинстве ситуаций, хотя - я обычно просто использую триггеры.
Если вы в порядке с ближайшими 0,01 секундами, вы можете использовать формат даты и назначить sysdate. Если вам нужно больше деталей, используйте метку времени.