Существует ли тип метки времени автоматической модификации для столбцов Oracle? - PullRequest
20 голосов
/ 23 октября 2009

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

Ответы [ 6 ]

18 голосов
/ 23 октября 2009

Уверен, что вы должны сделать это с помощью триггера в 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;
15 голосов
/ 23 октября 2009

Да, через триггер:

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;

Предполагается, что в вашей таблице имеется поле с именемified_on.

Как было отмечено выше, триггер является идеальным кандидатом в любое время, когда у вас есть несколько разных мест, где обновляется таблица. Если у вас есть только одна функция / процедура, которая может обновить таблицу, просто сделайте это там и пропустите триггер.

7 голосов
/ 23 октября 2009

Для оракула я обычно использую триггер для обновления поля отметки времени

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

Похоже, что в Oracle нет встроенного атрибута для обновления поля отметки времени до текущей отметки времени (в отличие от других БД, таких как MySQL).

6 голосов
/ 26 октября 2009

Вы можете очень близко к этому обратиться, запросив 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 
1 голос
/ 26 октября 2009

Еще один способ справиться с этим - включить детальный аудит. Отдельные строки не будут иметь отметки времени, но у вас будет запись обо всех изменениях. Хотя в большинстве ситуаций это перебор - я обычно использую триггеры.

Если вы в порядке с ближайшими 0,01 секундами, вы можете использовать формат даты и назначить sysdate. Если вам нужно больше подробностей, используйте отметку времени.

0 голосов
/ 23 октября 2009

Таблицы, которые я смоделировал, всегда включают:

  • CREATED_USER, VARCHAR2
  • CREATED_DATE, ДАТА
  • UPDATED_USER, VARCHAR2
  • UPDATED_DATE, ДАТА

... столбцы. Зачем реализовывать триггер, если вы можете установить значение одновременно с INSERT / UPDATE?

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

UPDATE TABLE
   SET ...,
       UPDATED_DATE = SYSDATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...