5.3 イベントログテーブル

イベントログテーブルは、発行イベントを保存します。この節では、イベントログテーブルの構造および機能について説明します。

イベントログテーブルとその列の名前をカスタマイズして、予約済みのデータベースキーワードとの衝突を避けることができます。ただし、その列の順序、番号、およびデータタイプは変更できません。列位置を認識しないデータベースでは、順序は「列名を並べ替える基準」パラメータによって決まります。列名を並べ替える基準を参照してください。

このテーブル内のイベントは、挿入順(record_id列)、または発生順(event_time列)のどちらかで並べることができます。イベントを発生順に並べると、イベント処理に時間がかかる可能性があります。発行イベントを発生順に並べるには、「将来のイベント処理を有効にしますか?」パラメータを論理値のTrueに設定します。将来のイベント処理を有効にしますか?を参照してください。

5.3.1 イベントログの列

この節では、イベントログテーブルの列について説明します。列は、位置の順に並べられています。

  1. record_id

    record_id列は、イベントログテーブル内の行を一意に識別したり、発行イベントを並べ替えたりするために使用されます。この列には、連続する一意の正の整数値を昇順に含める必要があります。record_id値間で、連続する数値に抜けがあっても、ポーリングサイクルが早く終わることはなくなりました。

  2. status

    status列は、特定の行の状態を示します。次の表は、使用可能な値を示しています。

    Table 5-9 ステータス列に使用できる値

    文字の値

    解釈

    N

    新規

    S

    成功

    W

    警告

    E

    エラー

    F

    致命的

    処理されるためには、イベントログテーブルに挿入されるすべての行がstatus値Nを保持する必要があります。その他のステータス文字は、発行者チャネルが処理済みの行を指定するためだけに使用されます。それ以外の文字すべて、将来の使用のために予約されています。

    NOTE:ステータス値では大文字と小文字が区別されます。

  3. event_type

    この列の値は1~8にする必要があります。その他の番号はすべて将来の使用のために予約されています。

    次の表は、各イベントタイプの説明です。

    Table 5-10 イベントタイプ

    イベントタイプ

    解釈

    1

    フィールドの挿入

    2

    フィールドの更新

    3

    フィールドの更新(すべての値の削除)

    4

    行の削除

    5

    行の挿入(クエリバック)

    6

    行の更新(クエリバック)

    7

    フィールドの挿入(クエリバック)

    8

    フィールドの更新(クエリバック)

    このフィールドの詳細については、Section 5.3.2, イベントタイプを参照してください。

  4. event_time

    この列は、record_idの代わりの並べ替え基準の列として機能します。イベントの有効な日付が含まれます。また、NULLにすることはできません。この列を並べ替えの基準の列にするには、「将来のイベント処理を有効にしますか?」パラメータを論理値のTrueに設定します。将来のイベント処理を有効にしますか?を参照してください。

  5. perpetrator

    この列は、イベントを発生させたデータベースユーザを識別します。NULL値は、ドライバユーザ以外のユーザと解釈されます。したがって、NULL値、またはドライバのデータベースユーザ名と等しくない値を含む行は、発行されます。ドライバのデータベースユーザ名と等しい値を持つ行は、「Allow Loopback Publisher (発行者のループバックを許可)」パラメータが論理値のTrueに発行されている場合以外は発行されません。ループバックを許可しますか?を参照してください。

  6. table_name

    イベントが発生したテーブルまたはビューの名前です。

  7. table_key

    論理データベースクラスのすべてのトリガ内で、この列の値が正確に同じになるようにフォーマットします。このパラメータのBNF (バッカス表記)を次に定義します。

    <table-key> ::= <unique-row-identifier> {"+"                 <unique-row-identifier>}
    
    <unique-row-identifier> ::= <primary-key-column-name> "=" <value>
    

    たとえば、この章で参照されるusrテーブルの場合、この列の値は、idu=1になります。

    この章で参照されるview_usrビューの場合、この列の値は、pk_empno=1になります。

    架空の複合プライマリキー(複数の列を含むもの)の場合、この列の値は、pkey1=value1+pkey2=value2になります。

    NOTE:table_keyフィールドに配置されるプライマリキー値に特殊文字{, ; ' + " = \ < >}のいずれかが含まれている場合は、値を二重引用符で区切ります。「{」および「}」は特殊文字のセットを囲んでいます。また、一組の二重引用符内に二重引用符"およびリテラルエスケープ文字の\文字が含まれる場合は、それぞれ\"および\\としてエスケープする必要があります。

    特殊文字を含む架空のプライマリキーの場合、この列の値は、pkey=", ; ' + \" = \\ < >"となります(二重引用符およびエスケープ文字に注意してください)。

    NOTE:パディングまたはフォーマットの違いによって、out-of-orderイベント処理になることがあります。パフォーマンスの理由から、数値内の不要な空白は削除します。たとえば、「idu= 1」よりも「idu=1」としてください(「idu= 1」には空白が含まれています)。

  8. column_name

    変更された列の名前です。この列を使用するのはフィールド単位のイベントタイプ(1~3、7~8)だけですが、常にイベントログテーブルに存在する必要があります。この列がない場合、発行者チャネルを開始できません。

  9. old_value

    フィールドの古い値です。この列を使用するのは、フィールド単位の非クエリバックのイベントタイプ(1~3)だけですが、常にイベントログテーブルに存在する必要があります。この列がない場合、発行者チャネルを開始できません。

  10. new_value

    フィールドの新しい値です。この列を使用するのは、フィールド単位の非クエリバックのイベントタイプ(1~3)だけですが、常にイベントログテーブルに存在する必要があります。この列がない場合、発行者チャネルを開始できません。

5.3.2 イベントタイプ

次の表は、各イベントタイプの説明です。

Table 5-11 イベントタイプ

イベントタイプ

解釈

1

フィールドの挿入

2

フィールドの更新

3

フィールドの更新(すべての値の削除)

4

行の削除

5

行の挿入(クエリバック)

6

行の更新(クエリバック)

7

フィールドの挿入(クエリバック)

8

フィールドの更新(クエリバック)

イベントタイプは、大きく4つのカテゴリに分けられます。一部のカテゴリは重複します。次の表は、各カテゴリとそれに該当するイベントタイプを示します。

Table 5-12 イベントカテゴリおよびタイプ

イベントカテゴリ

イベントタイプ

フィールド(属性)単位

1, 2, 3, 7, 8

行(オブジェクト)単位

4, 5, 6

非クエリバック

1, 2, 3, 4

クエリバック

5, 6, 7, 8

フィールド単位、非クエリバック

1, 2, 3

フィールド単位、クエリバック

7, 8

行単位、非クエリバック

4

行単位、クエリバック

5, 6

通常は、容量、時間、実装の複雑さ、およびパフォーマンス間で最適な兼ね合いになるように各カテゴリのイベントタイプを組み合わせます。

フィールド単位のイベントタイプは、行単位のイベントタイプよりも、詳細で、多くの容量を必要とし、また実装が複雑です。行単位のイベントは、フィールド単位のイベントタイプよりも、大まかで、必要な容量が少なく、実装が簡単です。

クエリバックイベントタイプは、非クエリバックイベントタイプよりも使用する容量は少なくて済みますが、処理時間は長くなります。非クエリバックイベントタイプは、クエリバックイベントタイプよりも使用する容量は多いですが、処理時間は短くなります。

クエリバックイベントタイプは、非クエリバックイベントタイプよりも優先されます。非クエリバックイベントは、クエリバックイベントが同じフィールドまたはオブジェクトに対するログに記録されている場合は無視されます。たとえば、タイプ2 (フィールドの更新、非クエリバック)および8 (フィールドの更新、クエリバック)が同じフィールドにログ記録される場合、タイプ2イベントは無視され、タイプ8イベントが優先されます。

さらに、クエリバック行イベントタイプは、クエリバックフィールドイベントタイプよりも優先されます。たとえば、イベントタイプ8 (フィールドの更新、クエリバック)およびイベントタイプ6 (行の更新、クエリバック)が同じオブジェクトにログ記録される場合、タイプ8イベントは無視され、タイプ6イベントが優先されます。

データベースオブジェクトが存在しなくなると、発行者はクエリバックイベントを無視します。これらは、処理時間中にまだ存在しているデータベースオブジェクトに依存します。したがって、ログ記録されたクエリバックの追加および変更(イベントタイプ5、6、7、8)は、参照しているデータベースオブジェクトが削除されると効果がなくなります。

次の表は、発行イベントタイプと発行者チャネルによって生成されるXDS XMLとの基本的な対応関係を示します。

Table 5-13 発行イベントタイプの基本的な対応関係

イベントタイプ

結果のXDS

挿入

<add>

更新

<modify>

削除

<delete>

次の例は、発行者チャネルが、発生する可能性があるイベントタイプごとにusrテーブルにログ記録されるイベントについて生成するXMLを示します。

CREATE TABLE indirect.usr ( idu   INTEGER  NOT NULL, fname VARCHAR2(64), photo LONGRAW, --...CONSTRAINT pk_usr_idu PRIMARY KEY(idu) );

次の表は、新しい行が挿入された後のusrの最初の内容を示します。

Table 5-14 usrテーブルに挿入された行

idu

fname

lname

photo

1

Jack

Frost

0xAAAA

次の表は、行が更新された後のusrの現在の内容を示します。

Table 5-15 usrテーブルで更新された行

idu

fname

lname

photo

1

John

Doe

0xBBBB

フィールドの挿入

次の表は、新規行がusrテーブルに挿入された後のイベントログテーブルの内容を示します。photo列の値は、Base64でエンコードされています。0xAAAAをBase64でエンコードした値は、qqo=です。

Table 5-16 イベントログテーブル: タイプ1

event_type

table

table_key

column_name

old_value

new_value

1

usr

idu=1

fname

NULL

Jack

1

usr

idu=1

lname

NULL

Frost

1

usr

idu=1

photo

NULL

qqo=

発行者チャネルは、次のXMLを生成します。

<add class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <add-attr attr-name="fname"> <value type="string">Jack</value> </add-attr> <add-attr attr-name="lname"> <value type="string">Frost</value> </add-attr> <add-attr attr-name="photo"> <value type="octet">qqo=</value> </add-attr> </add>

フィールドの更新

次の表は、usrテーブル内の行が更新された後のイベントログテーブルの内容を示します。photo列の値は、Base64でエンコードされています。0xBBBBをBase64でエンコードした値は、u7s=です。

Table 5-17 イベントログテーブル: タイプ2

event_type

table

table_key

column_name

old_value

new_value

2

usr

idu=1

fname

Jack

John

2

usr

idu=1

lname

Frost

Doe

2

usr

idu=1

photo

qqo=

u7s=

発行者チャネルは、次のXMLを生成します。

<modify class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <modify-attr attr-name="fname"> <remove-value> <value type="string">Jack</value> </remove-value> <add-value> <value type="string">John</value> </add-value> </modify-attr> <modify-attr attr-name="lname"> <remove-value> <value type="string">Frost</value> </remove-value> <add-value> <value type="string">Doe</value> </add-value> </modify-attr> <modify-attr attr-name="photo"> <remove-value> <value type="octet">qqo=</value> </remove-value> <add-value> <value type="octet">u7s=</value> </add-value> </modify-attr> </modify>

フィールドの更新(すべての値の削除)

次の表は、usrテーブル内の行が更新された後のイベントログテーブルの内容を示します。photo列の値は、Base64でエンコードされています。

Table 5-18 イベントログテーブル: タイプ3

event_type

table

table_key

column_name

old_value

new_value

3

usr

idu=1

fname

Jack

John

3

usr

idu=1

lname

Frost

Doe

3

usr

idu=1

photo

qqo=

u7s=

発行者チャネルは、次のXMLを生成します。

<modify class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <modify-attr attr-name="fname"> <remove-all-values/> <add-value> <value type="string">John</value> </add-value> </modify-attr> <modify-attr attr-name="lname"> <remove-all-values/> <add-value> <value type="string">Doe</value> </add-value> </modify-attr> <modify-attr attr-name="photo"> <remove-all-values/> <add-value> <value type="octet">u7s=</value> </add-value> </modify-attr> </modify>

行の削除

次の表は、usrテーブル内の行が削除された後のイベントログテーブルの内容を示します。

Table 5-19 イベントログテーブル: タイプ4

event_type

table

table_key

column_name

old_value

new_value

4

usr

idu=1

NULL

NULL

NULL

発行者チャネルは、次のXMLを生成します。

<delete class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> </delete>

行の挿入(クエリバック)

次の表は、新規行がusrテーブルに挿入された後のイベントログテーブルの内容を示します。

Table 5-20 イベントログテーブル: タイプ5

event_type

table

table_key

column_name

old_value

new_value

5

usr

idu=1

NULL

NULL

NULL

発行者チャネルは、次のXMLを生成します。値は、usrテーブルの最初の内容ではなく現在の内容を反映しています。

<add class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <add-attr attr-name="fname"> <value type="string">John</value> </add-attr> <add-attr attr-name="lname"> <value type="string">Doe</value> </add-attr> <add-attr attr-name="photo"> <value type="octet">u7s=</value> </add-attr> </add>

行の更新(クエリバック)

次の表は、usrテーブル内の行が更新された後のイベントログテーブルの内容を示します。

Table 5-21 イベントログテーブル: タイプ6

event_type

table

table_key

column_name

old_value

new_value

6

usr

idu=1

NULL

NULL

NULL

発行者チャネルは、次のXMLを生成します。値は、usrテーブルの最初の内容ではなく現在の内容を反映しています。

<modify class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <modify-attr attr-name="fname"> <remove-all-values/> <add-value> <value type="string">John</value> </add-value> </modify-attr> <modify-attr attr-name="lname"> <remove-all-values/> <add-value> <value type="string">Doe</value> </add-value> </modify-attr> <modify-attr attr-name="photo"> <remove-all-values/> <add-value> <value type="octet">u7s=</value> </add-value> </modify-attr> </modify>

フィールドの挿入(クエリバック)

次の表は、新規行がusrテーブルに挿入された後のイベントログテーブルの内容を示します。古い値および新しい値は、使用されないので省略されます。

Table 5-22 イベントログテーブル: タイプ7

event_type

table

table_key

column_name

old_value

new_value

7

usr

idu=1

fname

NULL

NULL

7

usr

idu=1

lname

NULL

NULL

7

usr

idu=1

photo

NULL

NULL

発行者チャネルは、次のXMLを生成します。値は、usrテーブルの最初の内容ではなく現在の内容を反映しています。

<add class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <add-attr attr-name="fname"> <value type="string">John</value> </add-attr> <add-attr attr-name="lname"> <value type="string">Doe</value> </add-attr> <add-attr attr-name="photo"> <value type="octet">u7s=</value> </add-attr> </add>

フィールドの更新(クエリバック)

次の表は、usrテーブル内の行が更新された後のイベントログテーブルの内容を示します。古い値および新しい値は、使用されないので省略されます。

Table 5-23 イベントログテーブル: タイプ8

event_type

table

table_key

column_name

old_value

new_value

8

usr

idu=1

fname

NULL

NULL

8

usr

idu=1

lname

NULL

NULL

8

usr

idu=1

photo

NULL

NULL

発行者チャネルは、次のXMLを生成します。値は、usrテーブルの最初の内容ではなく現在の内容を反映しています。

<modify class-name="usr"> <association>idu=1,table=usr,schema=indirect </association> <modify-attr attr-name="fname"> <remove-all-values/> <add-value> <value type="string">John</value> </add-value> </modify-attr> <modify-attr attr-name="lname"> <remove-all-values/> <add-value> <value type="string">Doe</value> </add-value> </modify-attr> <modify-attr attr-name="photo"> <remove-all-values/> <add-value> <value type="octet">u7s=</value> </add-value> </modify-attr> </modify>