วันพฤหัสบดีที่ 30 เมษายน พ.ศ. 2552

ต้องการตรวจสอบการทำงานของ sys บน oracle

เมื่อผู้ดูแล oracle database ต้องการที่จะการตรวจสอบ(audit)การทำงานของผู้ใช้ 
ผู้ดูแลสามารถใช้ audit_trail พารามิเตอร์ เพื่อเริ่มต้นการตรวจสอบผู้ใช้งานได้
แต่อย่างไรก็ตาม การใช้ audit_trail ไม่สามารถที่จะตรวจสอบการทำงานของ sys

ดังนั้นเราต้องใช้ AUDIT_SYS_OPERATIONS เท่ากับ true เข้ามาช่วย 
เพื่อตรวจสอบการทำงานของ sys หรือผู้ใช้ที่ติดต่อดาต้าเบสด้วย sysdba หรือ sysoper

ตัวอย่าง:
SQL> show parameter audit_sys_operations
NAME                                 TYPE        VALUE
-----------------------------------------------------------------
audit_sys_operations      boolean     FALSE
SQL> alter system set audit_sys_operations=true scope=spfile;
SQL> shutdown
SQL> startup
SQL> show parameter audit_sys_operations
NAME                                 TYPE        VALUE
-----------------------------------------------------------------
audit_sys_operations      boolean     TRUE

ข้อมูลในการตรวจสอบจะถูกเขียนลง OS ในโฟลเดอร์ audit_file_dest 

SQL> show parameter audit_file_dest
NAME                                 TYPE        VALUE
------------------------------------------------------------------
audit_file_dest       string      $ORACLE_BASE/admin/$ORACLE_SID/adump  
 ตัวอย่างการเช็ค audit ไฟล์:
SQL> show parameter audit_file_dest
NAME                                 TYPE        VALUE
------------------------------------------------------------------
audit_file_dest       string      $ORACLE_BASE/admin/$ORACLE_SID/adump                                         
$ sqlplus / as sysdba
SQL> SELECT p.spid FROM   v$process p,   v$session s WHERE  p.addr = s.paddr and s.sid = (SELECT SYS_CONTEXT ('USERENV', 'SID') from dual);
SPID
------------
25561

SQL> select 'test' from dual;

'TES
----
test

$ cat $ORACLE_BASE/admin/$ORACLE_SID/adump/ora_25561.aud

Audit file $ORACLE_BASE/admin/$ORACLE_SID/adump/ora_25561.aud
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
.
.
.
Wed Mar 28 15:47:28 2007
ACTION : 'CONNECT'
DATABASE USER: '/'
PRIVILEGE : SYSDBA
CLIENT USER: oracle
CLIENT TERMINAL: 
STATUS: 0
.
.
.
Fri May  1 02:22:33 2009
LENGTH : '154'
ACTION :[23] 'select 'test' from dual'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/9'
STATUS:[1] '0'
จากตัวอย่างข้างบน จะแสดงข้อมูลการใช้งานของ session ที่ติดต่อดาต้าเบส ด้วย sysdba

หากต้องการให้ฟอร์แมทใน audit ไฟล์ เป็น XML เราต้องเซตค่า AUDIT_TRAIL เป็น XML

เมื่อเราเริ่มต้นการตรวจสอบผู้ใช้งาน สิ่งที่สำคัญอย่างหนึ่งที่ขาดไม่ได้ ก็คือ การเข้าไปตรวจสอบข้อมูล อย่างต่อเนื่อง 


วันพุธที่ 28 มกราคม พ.ศ. 2552

ROWID


rowid เ็ป็น column ที่ unique เก็บ address ของ row นั้นๆ

SQL> select rowid, id from A;

ROWID                      ID
------------------ ----------
AAAUd2AAHAAAACTAAB          1
AAAUd2AAHAAAACTAAC          2

ตั้งแต่ Oracle Release 8i เราจะพบ Extended Rowids ซึ่งจะเก็บด้วย BASE64 Encoding
ซึ่่งแบ่งเป็น 4 ส่วน

- OOOOOO: เรียกว่า data object number จะเป็นตัวบอกเกี่ยวกับ segment 
- FFF: ตัวบอกกี่ยวกับ datafile number
- BBBBBB: เป็นตัวบอกว่าอยู่บน block number อะำไรของ datafile...
- RRR: row...

 SELECT ROWID, 
   SUBSTR(ROWID,1,6) "OBJECT", 
   SUBSTR(ROWID,7,3) "FIL", 
   SUBSTR(ROWID,10,6) "BLOCK", 
   SUBSTR(ROWID,16,3) "ROW" from A;

ROWID              OBJECT                   FIL          BLOCK                    ROW
------------------ ------------------------ ------------ ------------------------ ------------
AAAUd2AAHAAAACTAAB AAAUd2                   AAH          AAAACT                   AAB
AAAUd2AAHAAAACTAAC AAAUd2                   AAH          AAAACT                   AAC

อย่างไรก็ตามเราสามารถหาข้อมูล เกี่ยวกับ rowid โดยใช้ dbms_rowid

> เช็ค datafile ที่ rowid  อยู่

SQL> select file_name
  2   from dba_data_files
  3   where file_id = dbms_rowid.rowid_to_absolute_fno('AAAUd2AAHAAAACTAAB', user, 'A');

FILE_NAME
--------------------------------------------------------------------------------
+DATA1/test.274.673800173


> เช็ค block ที่  rowid อยู่

SQL> select dbms_rowid.rowid_block_number('AAAUd2AAHAAAACTAAB') from dual;

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAAUD2AAHAAAACTAAB')
---------------------------------------------------
                                                147


> และสามารถเช็คได้ว่า อยู่ที่ row ไหน

SQL> select dbms_rowid.rowid_row_number('AAAUd2AAHAAAACTAAB') from dual;

DBMS_ROWID.ROWID_ROW_NUMBER('AAAUD2AAHAAAACTAAB')
-------------------------------------------------
                                                1

เรายังสามารถใช้ rowid ได้มากมาย...

วันเสาร์ที่ 10 มกราคม พ.ศ. 2552

เปลี่ยน PORT 8080 บน Oracle Express


เมื่อลง oracle express เราจะเข้าใช้งานเว็บ

http://localhost:8080/apex

แต่หลายคนจะเกิดปัญหาเพราะว่า Port นี้ถูใช้ด้วย Program อื่นๆๆ เราสามารถเปลี่ยนได้ ด้วย dbms_xdb package.

dbms_xdb.sethttpport('new_port'); ใช้เปลี่ยนport http

dbms_xdb.setftpport('new_port'); ใช้เปลี่ยนport ftp

ตัวอย่าง
sqlplus / as sysdba SQL> select dbms_xdb.gethttpport , dbms_xdb.getftpport from dual;
GETHTTPPORT GETFTPPORT
----------- ----------
8080 0

SQL> begin
2 dbms_xdb.sethttpport('8081');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> select dbms_xdb.gethttpport , dbms_xdb.getftpport from dual;
GETHTTPPORT GETFTPPORT
----------- ----------
8081 0

Test.... http://localhost:8081/apex/