11g AUDIT的TIMESTAMP時間戳

yangtingkun發表於2010-04-14

11gAUDIT記錄中的TIMESTAMP時間戳使用的是0時區的時間。

 

 

利用YANGTK使用者登陸,引發AUDIT記錄:

SQL> CONN YANGTK
輸入口令:
已連線。

SQL> SELECT SESSIONID, USERID, TO_CHAR(NTIMESTAMP#, 'YYYY-MM-DD HH24:MI:SS.FF')
  2  FROM SYS.AUD$
  3  WHERE USERID = USER;

 SESSIONID USERID                         TO_CHAR(NTIMESTAMP#,'YYYY-MM-
---------- ------------------------------ -----------------------------
    153091 YANGTK                         2010-04-15 00:04:41.197504

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;

TO_CHAR(SYSDATE,'YY
-------------------
2010-04-15 08:05:44

可以看到,當前的時間是8點,而對應的0時區的時間是0點。當設定歸檔時間戳時:

SQL> CONN / AS SYSDBA
已連線。
SQL> BEGIN
  2  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
  3  DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  SYSTIMESTAMP);
  5  END;
  6  /

PL/SQL 過程已成功完成。

SQL> SELECT AUDIT_TRAIL,
  2     TO_CHAR(LAST_ARCHIVE_TS, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
  3  FROM DBA_AUDIT_MGMT_LAST_ARCH_TS;

AUDIT_TRAIL          TO_CHAR(LAST_ARCHIVE_TS,'YYYY-MM-DDH
-------------------- ------------------------------------
STANDARD AUDIT TRAIL 2010-04-15 08:13:05.373926 +00:00

SQL> SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM') FROM DUAL;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM-DDHH24
------------------------------------
2010-04-15 08:15:36.618316 +08:00

即使SYSTIMESTAMP包括時區時間,在賦值的時候,並沒有轉化為0時區的時間,而是直接將8時區的時間作為0時區的時間進行的賦值。

這也就導致了歸檔時間戳和預計要設定的時間相差了8個小時。

SQL> SELECT TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'GMT',
  2  'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
  3  FROM DUAL;

TO_CHAR(SYSTIMESTAMPATTIMEZONE'GMT',
------------------------------------
2010-04-15 00:21:14.529442 +00:00

SQL> BEGIN
  2  DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(
  3  DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
  4  SYSTIMESTAMP AT TIME ZONE 'GMT');
  5  END;
  6  /

PL/SQL 過程已成功完成。

SQL> SELECT AUDIT_TRAIL,
  2     TO_CHAR(LAST_ARCHIVE_TS, 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
  3  FROM DBA_AUDIT_MGMT_LAST_ARCH_TS;

AUDIT_TRAIL          TO_CHAR(LAST_ARCHIVE_TS,'YYYY-MM-DDH
-------------------- ------------------------------------
STANDARD AUDIT TRAIL 2010-04-15 00:21:50.626241 +00:00

為了避免錯誤的產生,使用SET_LAST_ARCHIVE_TIMESTAMP輸入時間戳的時候,就需要指定0時區的時間輸入,而不能直接輸入SYSTIMESTAMPSYSDATE等當前時區的時間。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-659766/,如需轉載,請註明出處,否則將追究法律責任。

相關文章