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

С IIS6 можно сделать одну из двух вещей:

  1. Установка фильтр ISAPI для отображения URL MVC на ASP.NET
  2. Включают расширение в URL. Например: htp://опция 1 localhost/Home.mvc

Since не доступна на большинстве веб-хостов, необходимо пойти для номера 2.

20
задан dkackman 27 May 2010 в 03:14
поделиться

6 ответов

Смоделированные мной таблицы всегда включают:

  • 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
0
ответ дан 29 November 2019 в 23:23
поделиться

Я уверен, что вам нужно сделать это с помощью триггера в 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;
19
ответ дан 29 November 2019 в 23:23
поделиться

Да, через trigger:

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.

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

15
ответ дан 29 November 2019 в 23:23
поделиться

Вы можете очень близко к этому подойти, запросив 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
ответ дан 29 November 2019 в 23:23
поделиться

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

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

1
ответ дан 29 November 2019 в 23:23
поделиться

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

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

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

7
ответ дан 29 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: