事件日志表可储存发布事件。 本节介绍事件日志表的结构和功能。
可自定义事件日志表的名称和列,以免与保留的数据库关键字冲突。 但是,事件日志表列的顺序、数目和数据类型是固定的。 在不了解列位置的数据库中,顺序由 Sort Column Names By 参数确定。请参见Sort Column Names By。
既可以按插入顺序(record_id 列)对该表中的事件排序,也可以按时间顺序(event_time 列)对其排序。 按时间顺序对事件排序可以延迟事件的处理。 要按时间顺序对发布事件排序,请将 Enable Future Event Processing 参数设置为布尔值 True。请参见Enable Future Event Processing?。
本节介绍事件日志表中的列。 按位置对列排序。
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。 要使该列成为排序列,请将 Enable Future Event Processing 参数设置为布尔值 True。请参见Enable Future Event Processing?。
该列标识发起事件的数据库用户。 NULL 值解释为除驱动程序用户以外的用户。 因此,将发布值为 NULL 或值不等于驱动程序的数据库用户名的行。 除非 Allow Loopback Publisher 参数设置为布尔值 True,否则不发布值等于驱动程序的数据库用户名的行。请参见Allow Loopback?.
发生了事件的表或视图的名称。
逻辑数据库类的所有触发器中,该列的格式值完全相同。 下面定义该参数的 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:填充或格式出现差异可能会导致事件处理失控。 出于性能方面的考虑,请去除数字值中任何不需要的空格。 例如,《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(更新字段,向后查询)的事件,则优先使用类型 8 事件,而忽略类型 2 事件。
此外,《向后查询行》事件类型优于《向后查询字段》事件类型。 例如,如果针对相同的对象记录了事件类型 8(更新字段,向后查询)和事件类型 6(更新行,向后查询),则优先使用类型 6 事件,而忽略类型 8 事件。
如果数据库对象不再存在,《发布者》将忽略《向后查询》事件。 这些事件依赖于仍在处理的数据库对象。 因此,删除了已记录的向后查询添加和修改事件(事件类型 5、6、7、8)所参照的数据库对象后,这些事件便不起作用。
下表显示发布事件类型与《发布者》通道生成的 XDS XML 之间的基本关联。
以下示例说明《发布者》通道针对每个可能的事件类型的 usr 表上记录的事件生成的 XML。
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 表的当前内容而不是初始内容。
<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>