LogMinerは、列の値に基づいた問合せを行うことができます。たとえば、hr.employees
表に対して行われた、salary
を一定額より多く増額するすべての更新を示す問合せを実行できます。このようなデータは、システム動作の分析や監査タスクの実行に使用できます。
LogMinerによるREDOログ・ファイルからのデータ抽出は、DBMS_LOGMNR.MINE_VALUE
およびDBMS_LOGMNR.COLUMN_PRESENT
という2つのマイニング関数を使用して実行されます。これらのマイニング関数に対するサポートは、V$LOGMNR_CONTENTS
ビューのREDO_VALUE
列とUNDO_VALUE
列によって提供されます。
次に、MINE_VALUE
関数を使用して、hr.employees
表に対して行われた、salary
列を元の値の2倍より多く増額したすべての更新を選択する例を示します。
SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'EMPLOYEES' AND SEG_OWNER = 'HR' AND OPERATION = 'UPDATE' AND DBMS_LOGMNR.MINE_VALUE(REDO_VALUE, 'HR.EMPLOYEES.SALARY') > 2*DBMS_LOGMNR.MINE_VALUE(UNDO_VALUE, 'HR.EMPLOYEES.SALARY');
この例で示したとおり、MINE_VALUE
関数には2つの引数があります。
最初の引数は、データのREDO部分(REDO_VALUE
)またはUNDO部分(UNDO_VALUE
)のいずれをマイニングするかを指定します。データのREDO部分とは、挿入、更新または削除操作後に列に含まれるデータです。データのUNDO部分とは、挿入、更新または削除操作前に列に存在していたデータです。REDO_VALUE
は新しい値、UNDO_VALUE
は古い値と考えてください。
2番目の引数は、マイニングする列の完全修飾名を指定する文字列(この場合は、hr.employees.salary
)です。MINE_VALUE
関数からは、常に、元のデータ型に戻すことができる文字列が返されます。
MINE_VALUE
関数がNULL
値を返した場合は、次のいずれかを意味します。
指定した列がデータのREDO部分またはUNDO部分に存在していない。
指定した列は存在するが、その値がNULL。
この2つの場合を区別するには、DBMS_LOGMNR
.COLUMN_PRESENT
関数を使用します。この関数では、列がデータのREDO部分またはUNDO部分に存在している場合は、1
が返されます。存在していない場合には、0
が返されます。たとえば、salary
列の値の増額および対応するトランザクション識別子を検索するとします。次のSQL問合せを発行します。
SELECT (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) AS XID, (DBMS_LOGMNR.MINE_VALUE(REDO_VALUE, 'HR.EMPLOYEES.SALARY') - DBMS_LOGMNR.MINE_VALUE(UNDO_VALUE, 'HR.EMPLOYEES.SALARY')) AS INCR_SAL FROM V$LOGMNR_CONTENTS WHERE OPERATION = 'UPDATE' AND DBMS_LOGMNR.COLUMN_PRESENT(REDO_VALUE, 'HR.EMPLOYEES.SALARY') = 1 AND DBMS_LOGMNR.COLUMN_PRESENT(UNDO_VALUE, 'HR.EMPLOYEES.SALARY') = 1;
MINE_VALUE
関数およびCOLUMN_PRESENT
関数には、次の使用規則が適用されます。
LogMinerセッション内でのみ使用できます。
V$LOGMNR_CONTENTS
ビューからの選択操作中に起動する必要があります。
LONG
、LONG RAW
、CLOB
、BLOB
、NCLOB
、ADT
またはCOLLECTION
データ型はサポートされません。