4.4 订购参数

下表汇总了 Subscriber-level 参数及其属性:

Table 4-35 Subscriber-Level 参数和属性

显示名称

标签名称

样本值

默认值

必需

Disable Subscriber?

禁用

1(是)

0(否)

no

Generation/Retrieval Method (Table-Global)

key-gen-method

auto

无(订购事件)

 

Retrieval Timing (Table-Global)

key-gen-timing

after(插入行之后)

before(插入行之前)

no

Method and Timing (Table-Local)

key-gen

usr("?=indirect.proc_idu()", before)

(无)

no

Disable Statement-Level Locking?

disable-locking

1(是)

0(否)

no

Check Update Counts?

check-update-count

0(否)

1(是)

no

Add Default Values on Insert?

add-default-values-on-view-insert

0(否)

(动态1

no

1 此默认值是在运行时从描述符文件动态派生的。

订购参数分为两个子类别:

4.4.1 未分类参数

Disable Subscriber?

Disable Subscriber? 参数指定是否禁用《订购者》通道。

如果此参数设置为布尔值 True,则禁用《订购者》通道。 如果此参数设置为布尔值 False,则《订购者》通道处于活动状态。

Table 4-36 Disable Subscriber?:属性

属性

Tag Name

disable

Required?

no

Default Value

0(否)

Legal Values

1、yes、true(是) 0、no、false(否)

Schema-Dependent

False

Disable Statement-Level Locking?

Disable Statement-Level Locking? 参数指定在执行每一条 SQL 语句以前,是否在此通道上显式锁定数据库资源。 仅当 Enable Statement-Level Locking? 设置为布尔值 True 时,此参数才处于活动状态。

如果此参数设置为布尔值 True,则显式锁定数据库资源。 如果此参数设置为布尔值 False,则不显式锁定数据库资源。

Table 4-37 Disable Statement-Level Locking?:属性

属性

Tag Name

disable-lockinging

Required?

no

Default Value

0(否)

Legal Values

1、yes、true(是) 0、no、false(否)

Schema-Dependent

True

Check Update Counts?

Check Update Counts? 参数指定针对某个表执行 INSERTUPDATEDELETE 语句时,《订购者》通道是否对表的实际更新情况进行检查。

如果设置为布尔值 True,则检查更新计数。 如果未更新任何项目,则引发异常。 如果设置为布尔值 False,则忽略更新计数。

如果在 before-trigger 逻辑中重新定义了语句,则将此参数设置为布尔值 False

如果使用 Microsoft SQL Server,则使用默认值,因为不会将触发器逻辑(可能回滚到某一事务)的错误传回到《订购者》通道。

Table 4-38 Check Update Counts?:属性

属性

Tag Name

check-update-count

Required?

no

Default Value

1(是)

Legal Values

1, yes, true (yes) 0, no, false (no)

Schema-Dependent

True

Add Default Values on Insert?

Add Default Values on Insert? 参数指定在某视图上执行 INSERT 语句时,《订购者》通道是否提供默认值。

此参数的主要用途是支持与 Microsoft SQL Server 2000 进行互操作。该数据库要求视图列约束的 NOT NULLINSERT 语句中有一个非 NULL 值。

如果此参数设置为布尔值 True,则为针对视图上执行的 INSERT 语句提供默认值,而显式值尚不可用。 如果此参数设置为布尔值 False,则不提供默认值。

Table 4-39 Add Default Values on Insert?:属性

属性

Tag Name

add-default-values-on-view-insert

Required?

no

Default Value

(dynamic1)

Legal Values

1, yes, true (yes) 0, no, false (no)

Schema-Dependent

True

1 此默认值是在运行时从描述符文件动态派生的。

4.4.2 主键参数

处理映射到 INSERT 语句的 <add> 事件时,《订购者》通道将使用主键值创建 Identity Manager 关联。 这些参数指定《订购者》通道如何以及何时获取构造关联值所必需的主键值。 获取主键值的方式即是主键生成/检索方法。 检索计时指明何时检索主键值。

下表确定支持的方法和计时:

Table 4-40 支持的方法和计时

方法

计时: before (row insertion)

计时: after (row insertion)

无(订购事件)

X

01

Driver(生成的订购者)

X

X

Auto(自动生成的/身份列)

02

X

(stored procedure/function)

X

X

1 《订购者》通道自动将此计时覆盖为 before2 《订购者》通道自动将此计时覆盖为 after

Generation/Retrieval Method (Table-Global)

Generation/Retrieval Method (Table-Global) 参数指定如何为所有父表和视图生成或检索主键值。 Method and Timing 参数基于每个表/视图覆盖此参数。请参见Method and Timing (Table-Local)

如果此参数设置为 none,则假定主键值已在订购事件中存在。 如果此参数设置为 driver,则通过下列方法之一生成主键值:

  • 如果检索计时设置为 before,则使用 SELECT (MAX()+1) 语句
  • 如果检索计时设置为 after,则使用 SELECT MAX() 语句

对于字符串列类型,《订购者》通道通过使用 System.CurrentTimeMillis() 的返回值来生成值。 不支持其它数据类型。

如果此参数设置为 auto则通过 java.sql.Statement.getGeneratedKeys():java.sql.ResultSet 方法检索主键值。 MySQL Connector/J JDBC 驱动程序是当前实现此方法的唯一支持的第三方 JDBC 驱动程序。请参见MySQL Connector/J JDBC 驱动程序

Table 4-41 Generation/Retrieval Method (Table-Global):属性

属性

Tag Name

key-gen-method

Required?

no

Default Value

无(订购事件)

Legal Values

无(订购事件)driver(生成的订购者)auto(自动生成的/身份列)

Schema-Dependent

True

Retrieval Timing (Table-Global)

Retrieval Timing (Table-Global) 参数指定《订购者》通道何时检索所有父表和视图的主键值。 Method and Timing (Table-Local) 参数会覆盖此参数。请参见Method and Timing (Table-Local)

如果此参数设置为 before,则在插入之前检索主键值。 如果此参数设置为 after,则在插入之后检索主键值。

Table 4-42 Retrieval Timing (Table-Global):属性

属性

Tag Name

key-gen-timing

Required?

no

Default Value

before(插入行之前)

Legal Values

before(插入行之前)after(插入行之后)

Schema-Dependent

True

Method and Timing (Table-Local)

Method and Timing (Table-Local) 参数基于父表/视图指定主键生成/检索方法和检索计时。 它本质上是将生成/检索方法和检索计时映射到表或视图名称。 此参数的语法使用多个自变量(例如 method-name(argument1argument2))来镜像过程编程语言方法调用。

如果使用 Tabel/View Names 参数,则可能需要对此参数值中参照的任何表、视图、储存过程或函数显式进行纲要限定。 如果使用 Schema Name 参数,则使用该纲要名称对此参数值中参照的表、视图、储存过程或函数隐式进行纲要限定。 如果此参数值中参照的表、视图、储存过程或函数不在隐式纲要中,则必须对它们进行纲要限定。

BNF

此参数值的 BNF(巴科斯-诺尔范式)表示法如下:

<key-gen> ::= <table-or-view-name> "(" <generation-retrieval-method>, <retrieval-timing> ")" {[<delimiter>] <key-gen>}

<generation-retrieval-method> ::= none | driver | auto | """ <procedure-signature> """ | """ <function-signature>  """

<table-or-view-name> ::= <legal-undelimited-database-table-or-view- identifier>

<delimiter> ::= ";" | "," | <white-space>

<procedure-signature> ::= <schema-qualifier> "." <stored-routine- name>"("<argument-list>")" 

<function-signature> ::= "?=" <procedure-signature>

<schema-qualifier> ::= <legal-undelimited-database-username-identifier>

<stored-routine-name> ::= <legal-undelimited-database-stored-routine -identifier>

<argument-list> ::= <column-name>{"," <column-name>}

<column-name> ::= <column-from-table-or-view-name-previously-specified>
生成或检索方法

生成或检索方法指定如何生成(如果必要)和检索主键值。 可能的方法有《无》、《驱动程序》、《自动》和《储存过程/函数》:

默认情况下,《订购者》通道假定 Identity Vault 是主键值的权威来源,并且必备值已经在给定的 <add> 事件中存在。 如果是这样,则无需生成主值,因为这些值已经存在。 只需要从当前的 <add> 事件中检索这些值。 将 eDirectory 特性(例如 GUID)显式纲要映射到父表或视图的主键列时,最好使用此方法。

假定存在一个名称为 usr 的表和一个名称为 view_usr 的视图,并且 Identity Vault 是主键值的权威来源,则此参数的值将类似于:

usr(none); view_usr(none)

如果使用此方法,建议将 GUID 而不是 CN 映射到父表或视图的主键列。

驱动程序 此方法假定数据库是指定的父表或视图主键值的权威来源。

在原型设计阶段或部署的初始阶段,经常需要在编写储存过程或函数之前让《订购者》通道生成主键值。 还可以针对不支持储存过程或函数的数据库使用此方法。 但在生产环境中使用此方法时,由 <add> 事件生成的所有 SQL 语句都应包含在可序列化事务中。有关其它信息,请参考Transaction Isolation Level

除了使所有事务可序列化以外,还可以使用嵌入式 SQL 特性来设置各个事务隔离级别。有关其它信息,请参考事务隔离级别

对于任何数字列类型,《订购者》通道均使用以下语句来生成主键值:

  • 简单的 SELECT(MAX+1) 语句,用于 before 计时
  • SELECT MAX() 语句,用于 after 计时

对于字符串列类型,《订购者》通道使用 System.CurrentTimeMillis() 的返回值生成值。 不支持其它数据类型。

假定存在一个名称为 usr 的表和一个名称为 view_usr 的视图,并且数据库是主键值的权威来源,则此参数的值将类似于:

usr(driver); view_usr(driver)

如果使用此方法,建议从纲要映射策略和通道过滤器中省略主键列。

自动 此方法假定数据库是指定的父表或视图主键值的权威来源。

有些数据库支持可自动生成插入行主键值的身份列。 此方法通过 JDBC 3 接口方法 java.sql.Statement.getGeneratedKeys():java.sql.ResultSet 检索自动生成的主键值。 MySQL Connector/J JDBC 驱动程序是当前实现此方法的唯一支持的第三方 JDBC 驱动程序。请参见MySQL Connector/J JDBC 驱动程序

假定存在一个名称为 usr 的表和一个名称为 view_usr 的视图,并且数据库是主键值的权威来源,则此参数的值将类似于:

usr(auto); view_usr(auto)

如果使用此方法,建议从纲要映射策略和通道过滤器中省略主键列。

储存过程/函数: 此方法假定数据库是指定父表或视图主键值的权威来源。

假定

  • 存在一个名称为 usr 的表,其主键列名称为 idu
  • 一个名称为 view_usr 的视图,其主键值名称为 pk_idu
  • 存在一个数据库函数 func_last_usr_idu 和储存过程 sp_last_view_usr_pk_idu,两者都返回为各自的表/视图最后生成的主键值

此参数的值将类似于:

usr("?=func_last_usr_idu()"); view_usr("sp_last_view_usr_pk_idu(pk_idu)")

在前面的示例中,参数被传递给储存过程。 也可以将参数传递给函数,但通常没有这个必要。 与函数不同,储存过程通常是通过参数返回值。 对于储存过程,必须将主键列作为 IN OUT 参数来传递。 必须将非键列作为 IN 参数来传递。

对于储存过程和函数,参数顺序、数字和数据类型必须与过程或函数所期望的参数的顺序、数字和数据类型相对应。

如果使用此方法,建议从纲要映射策略和通道过滤器中省略主键列。

Retrieval Timing

Retrieval Timing 参数指定何时检索主键值。

<add> 事件始终会导致针对父表或视图至少执行一个 INSERT 语句。 此参数的此部分指定要在何时相对于初始 INSERT 语句检索主键值。

Before 这是默认设置。 如果指定了此设置,则在初始 INSERT 语句之前检索主键值。

IMPORTANT:auto 以外的所有生成/检索方法都支持此检索计时。 none 方法必需检索计时。

After 如果指定了此设置,则在初始 INSERT 语句之后检索主键值。

IMPORTANT:none 以外的所有生成/检索方法都支持此检索计时。 auto 方法必需检索计时。

以下示例通过添加检索计时信息对前几个示例进行了补充:

usr(none,before); view_usr(none,before)

usr(driver,before); view_usr(driver,after)

usr(auto,after); view_usr(auto,after)

usr("?=func_last_usr_idu()",before); view_usr("sp_last_view_usr_pk_idu(pk_idu)",after)

下表列出了此参数的属性:

Table 4-43 Retrieval Timing:属性

属性

Tag Name

key-gen

Required?

no

Case-Sensitive?

请参见未定界标识符的大小写问题

Sample Value

usr("?=proc_idu()",before)

Default Value

(none)

Legal Value

(any string adhering to the BNF)

纲要-Dependent

True