事件記錄表格會儲存發行事件。 本節討論事件記錄表格的結構和功能。
您可以自定事件記錄表格及其欄的名稱,以避免與保留的資料庫關鍵字相衝突。 不過,其欄的順序、數目和資料類型都是固定的。 在不瞭解欄位置的資料庫中,順序會由「欄名稱排序方式」參數決定。 請參閱欄名稱排序方式。
此表格中的事件可以依插入順序 (record_id 欄) 或時間順序 (event_time 欄) 排序。 依時間排序事件會延遲事件處理。 若要依時間排序發行事件,請將「啟用未來事件處理」參數設為布林值 True。 請參閱啟用未來事件處理?。
本節會描述事件記錄表格中的欄。 欄依位置排序。
record_id 欄用於唯一識別事件記錄表格中的列並排序發行事件。 此欄必須包含循序、遞增、唯一的正整數值。 record_id 值之間的不連續不再會提前結束輪詢週期。
status 欄會指出給定列的狀態。 下表列出允許的值:
若要進行處理,所有插入至事件記錄表格中的列都必須具有 status 值 N。狀態字元的其他部份只會由「發行者」通道用來指定已處理列。 所有其他字元都會保留供以後使用。
NOTE:狀態值區分大小寫。
此欄中的值必須在 1 到 8 之間。所有其他數值會保留供以後使用。
下表描述每個事件類型:
Table 5-10 事件類型
|
事件類型 |
解譯 |
|---|---|
|
1 |
插入欄位 |
|
2 |
更新欄位 |
|
3 |
更新欄位 (移除所有值) |
|
4 |
刪除列 |
|
5 |
插入列 (查詢回覆) |
|
6 |
更新列 (查詢回覆) |
|
7 |
插入欄位 (查詢回覆) |
|
8 |
更新欄位 (查詢回覆) |
如需此欄位的其他資訊,請參閱Section 5.3.2, 事件類型。
此欄做為 record_id 的取代排序欄使用。它包含事件的有效日期。 它不能是 NULL。若要使此欄成為排序欄,請將「啟用未來事件處理」參數設為布林值 True。 請參閱啟用未來事件處理?。
此欄會識別啟動事件的資料庫使用者。 NULL 值會解譯為使用者,而不是驅動程式使用者。 同樣,會發行具有 NULL 值或不等同於驅動程式資料庫使用者名稱的列。 除非「允許迴路發行者」參數設為布林值 True,否則不會發行值為驅動程式資料庫使用者名稱的列。 請參閱允許迴路?。
發生事件之表格或檢視窗的名稱。
此欄的格式值,在邏輯資料庫類別的所有觸發中都完全相同。 此參數的 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” 中的空格)。
已變更的欄名。 此欄僅用於每個欄位 (1-3, 7-8) 事件類型。 不過,它必須一直呈現在事件記錄表格中。 如果遺失,則「發行者」通道無法啟動。
欄位的舊值。 此欄僅用於每個欄位、非查詢回覆事件類型 (1-3)。 不過,它必須一直呈現在事件記錄表格中。 如果遺失,則「發行者」通道無法啟動。
欄位的新值。 此欄僅用於每個欄位、非查詢回覆事件類型 (1-3)。 不過,它必須一直呈現在事件記錄表格中。 如果遺失,則「發行者」通道無法啟動。
下表描述每個事件類型:
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 之間的基本關連性。
下列範例說明由「發行者」通道針對事件產生的 XML,這些事件記錄在每個可能的事件類型之 usr 表格上。
CREATE TABLE indirect.usr ( idu INTEGER NOT NULL, fname VARCHAR2(64), photo LONGRAW, --... CONSTRAINT pk_usr_idu PRIMARY KEY(idu) );
下表顯示插入新列之後,usr 的啟始內容:
下表顯示更新列之後,usr 的目前內容:
下表會顯示新列插入至表格 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>