5.3 事件記錄表格

事件記錄表格會儲存發行事件。 本節討論事件記錄表格的結構和功能。

您可以自定事件記錄表格及其欄的名稱,以避免與保留的資料庫關鍵字相衝突。 不過,其欄的順序、數目和資料類型都是固定的。 在不瞭解欄位置的資料庫中,順序會由「欄名稱排序方式」參數決定。 請參閱欄名稱排序方式

此表格中的事件可以依插入順序 (record_id 欄) 或時間順序 (event_time 欄) 排序。 依時間排序事件會延遲事件處理。 若要依時間排序發行事件,請將「啟用未來事件處理」參數設為布林值 True。 請參閱啟用未來事件處理?

5.3.1 事件記錄欄

本節會描述事件記錄表格中的欄。 欄依位置排序。

  1. record_id

    record_id 欄用於唯一識別事件記錄表格中的列並排序發行事件。 此欄必須包含循序、遞增、唯一的正整數值。 record_id 值之間的不連續不再會提前結束輪詢週期。

  2. status

    status 欄會指出給定列的狀態。 下表列出允許的值:

    Table 5-9 Status 欄的允許值

    字元值

    解譯

    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 值或不等同於驅動程式資料庫使用者名稱的列。 除非「允許迴路發行者」參數設為布林值 True,否則不會發行值為驅動程式資料庫使用者名稱的列。 請參閱允許迴路?

  6. table_name

    發生事件之表格或檢視窗的名稱。

  7. table_key

    此欄的格式值,在邏輯資料庫類別的所有觸發中都完全相同。 此參數的 BNF 或 Backus Naur Form 定義如下:

    <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:填塞或格式化上的差異可能會導致事件處理發生問題。 由於效能原因,從數值移除所有不需要的空白。 例如,"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

更新欄位 (查詢回覆)

事件類型主要分為四個類別。 部份類別會重疊。 下表描述每個類別,並指出是成員的事件類型:

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>

下列範例說明由「發行者」通道針對事件產生的 XML,這些事件記錄在每個可能的事件類型之 usr 表格上。

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>