Подтвердить что ты не робот

Существует ли тип времени автоматической модификации для столбцов Oracle?

Есть ли способ создать столбец timestamp в Oracle, который автоматически сохраняет метку времени, когда запись изменилась?

4b9b3361

Ответ 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. Если вам нужно больше деталей, используйте метку времени.