bestsource

Oracle 열에 대한 자동 수정 타임스탬프 유형이 있습니까?

bestsource 2023. 6. 13. 22:28
반응형

Oracle 열에 대한 자동 수정 타임스탬프 유형이 있습니까?

오라클에서 레코드가 변경되었을 때의 타임스탬프를 자동으로 저장하는 타임스탬프 열을 만드는 방법이 있습니까?

예, 트리거를 통해:

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이라는 필드가 있다고 가정합니다.

위에서 언급했듯이 테이블이 업데이트되는 여러 다른 위치가 있을 때마다 트리거가 이상적인 후보입니다.테이블을 업데이트할 수 있는 기능/프로시저가 하나뿐인 경우에는 해당 기능/프로시저만 수행하고 트리거를 건너뜁니다.

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;

오라클의 경우 일반적으로 트리거를 사용하여 타임스탬프 필드를 업데이트합니다.

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

Oracle에는 MySQL과 같은 다른 DB와 달리 타임스탬프 필드를 현재 타임스탬프로 업데이트하기 위한 기본 제공 속성이 없는 것 같습니다.

쿼리를 통해 매우 가까이 접근할 수 있습니다.ORA_ROWSCN: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns007.htm#sthref825

행 종속성 옵션을 사용하여 테이블을 생성한 경우 더 정확합니다.

실제로 레코드의 커밋 시간을 기록합니다.

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 

이 문제를 해결하는 또 다른 방법은 세분화된 감사 기능을 설정하는 것입니다.개별 행에는 타임스탬프가 없지만 모든 변경 사항에 대한 레코드가 있습니다.하지만 대부분의 상황에서 과잉 살상은 -- 저는 보통 방아쇠를 사용합니다.

0.01초 가까이 있어도 괜찮으면 날짜 형식을 사용하여 sysdate를 할당할 수 있습니다.자세한 내용이 필요한 경우 타임스탬프를 사용합니다.

제가 모델링한 표는 항상 다음과 같습니다.

  • CREATED_USERVARCHAR2
  • CREATED_DATE날짜
  • UPDATED_USERVARCHAR2
  • UPDATED_DATE날짜

...어쨌든.INSERT/UPDATE와 동시에 값을 설정할 수 있는데 트리거를 구현하는 이유는 무엇입니까?

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

UPDATE TABLE
   SET ...,
       UPDATED_DATE = SYSDATE

언급URL : https://stackoverflow.com/questions/1614233/is-there-an-automatic-modification-time-stamp-type-for-oracle-columns

반응형