4.4 訂閱參數

下表概述「訂閱者層級」參數及其內容:

Table 4-35 訂閱者層級參數和內容

顯示名稱

標籤名稱

範例值

預設值

必要

停用訂閱者?

disable

1 (是)

0 (否)

no

產生/取回方法 (全域表格)

key-gen-method

auto

none (訂閱事件)

 

取回時機 (全域表格)

key-gen-timing

after (在列插入之後)

before (在列插入之前)

no

方法和時機 (本地表格)

key-gen

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

(無)

no

停用陳述式層級鎖定?

disable-locking

1 (是)

0 (否)

no

檢查更新計數?

check-update-count

0 (否)

1 (是)

no

插入時新增預設值?

add-default-values-on-view-insert

0 (否)

(動態1)

no

1此預設值會在執行時期以動態的方式自描述元檔案衍生。

訂閱參數分為兩個子類別:

4.4.1 未分類參數

停用訂閱者?

「停用訂閱者?」參數可指定是否停用「訂閱者」通道。

此參數設為布林值 True 時,「訂閱者」通道會停用。 當參數設為布林值 False 時,「訂閱者」通道會啟用。

Table 4-36 停用訂閱者?:內容

內容

標籤名稱

disable

必要?

no

預設值

0 (否)

正確的值

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

與綱要相依

False

停用陳述式層級鎖定?

「停用陳述式層級鎖定?」參數可指定在執行每個 SQL 陳述式之前,是否在此通道上明確地鎖定資料庫資源。 只有在 啟用陳述式層級鎖定? 設為布林值 True 時,此參數才會為使用中。

此參數設為布林值 True 時,資料庫資源便會明確地鎖定。 此參數設為布林值 False 時,資料庫資源則不會明確地鎖定。

Table 4-37 停用陳述式層級鎖定?:內容

內容

標籤名稱

disable-locking

必要?

no

預設值

0 (否)

正確的值

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

與綱要相依

True

檢查更新計數?

「檢查更新計數?」參數可指定「訂閱者」通道是否會檢查當針對表格執行 INSERTUPDATEDELETE 陳述式時,是否實際更新表格。

當設為布林值 True 時,會檢查更新計數。 如果沒有更新任何項目,則會發生例外。 當設為布林值 False 時,會忽略更新計數。

當在觸發前邏輯中重新定義陳述式時,將其參數設為布林值 False。

因為觸發邏輯 (其可能會復原異動) 中的錯誤不會傳達至「訂閱者」通道,所以當使用 Microsoft SQL Server 時,請使用預設值。

Table 4-38 檢查更新計數?:內容

內容

標籤名稱

check-update-count

必要?

no

預設值

1 (是)

正確的值

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

與綱要相依

True

插入時新增預設值?

「插入時新增預設值?」參數可指定當針對檢視窗執行 INSERT 陳述式時,「訂閱者」通道是否提供預設值。

此參數的主要目的是啟用與 Microsoft SQL Server 2000 的互動。此資料庫需要限制為 NOT NULL 的檢視欄在 INSERT 陳述式中具有非 NULL 值。

當此參數設為布林值 True 時,預設值會提供給針對檢視窗所執行的 INSERT 陳述式,且尚不可以使用明確值。 當此參數設為布林值 False 時,不會提供預設值。

Table 4-39 插入時新增預設值?:內容

內容

標籤名稱

add-default-values-on-view-insert

必要?

no

預設值

(動態1)

正確的值

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

與綱要相依

True

1此預設值會在執行時期以動態的方式自描述元檔案衍生。

4.4.2 主索引鍵參數

當處理映射至 INSERT 陳述式的 <add> 事件時,「訂閱者」通道會使用主索引鍵值來建立 Identity Manager 關聯。 這些參數可指定「訂閱者」通道取得建構關聯值所需之主索引鍵值的方式和時間。 取得主索引鍵值的方式是主索引鍵產生/取回方法。 取回時機是指取回主索引鍵值的時間。

下表識別受支援的方法和時機:

Table 4-40 受支援的方法和時機

方法

時機: before (列插入)

時機: after (列插入)

None (訂閱事件)

X

01

Driver (訂閱者所產生)

X

X

Auto (自動產生的/身份欄)

02

X

(預存程序/函數)

X

X

1「訂閱者」通道會自動將此時機置換為 before2「訂閱者」通道會自動將此時機置換為 after

產生/取回方法 (全域表格)

「產生/取回方法 (全域表格)」參數可指定如何針對所有父表格和檢視窗來產生或取回主索引鍵值。 「方法和時機」參數會在每個表格/檢視窗上置換此參數。 請參閱方法和時機 (本地表格)

當此參數設為 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 產生/取回方法 (全域表格):內容

內容

標籤名稱

key-gen-method

必要?

no

預設值

none (訂閱事件)

正確的值

none (訂閱事件) driver (訂閱者所產生) auto (自動產生的/身份欄)

與綱要相依

True

取回時機 (全域表格)

「取回時機 (全域表格)」參數可指定「訂閱者」通道取回所有父表格和檢視窗之主索引鍵值的時間。 「方法和時機 (本地表格)」參數會置換此參數。 請參閱方法和時機 (本地表格)

當此參數設為 before 時,會在插入之前取回主索引鍵值。 當此參數設為 after 時,會在插入之後取回主索引鍵值。

Table 4-42 取回時機 (全域表格):內容

內容

標籤名稱

key-gen-timing

必要?

no

預設值

before (在列插入之前)

正確的值

before (在列插入之前) after (在列插入之後)

與綱要相依

True

方法和時機 (本地表格)

「方法和時機 (本地表格)」參數可指定每個父表格/檢視窗的主索引鍵值產生/取回方法和取回時機。 它實際上會將產生/取回方法和取回時機映射至表格或檢視窗名稱。此參數的語法會以多個引數 (例如,方法名稱 (引數 1, 引數 2)) 鏡像複製程序的程式設計語言方法呼叫。

當使用表格/檢視窗名稱 參數時,您可能需要對此參數值中參考的所有表格、檢視窗、預存程序或函數進行明確的綱要限定。 當使用綱要名稱參數時,會以該綱要名稱對此參數值中參考的所有表格、檢視窗、預存程序或函數進行隱含的綱要限定。如果此參數值中參考的表格、檢視窗、預存程序或函數位於非隱含綱要的不同綱要中,則必須對它們進行綱要限定。

BNF

此參數值的 BNF (Backus Naur Form) 表示如下所示:

<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>
產生或取回方法

產生或取回方法可指定如何產生或取回 (必要時) 主索引鍵值。 可能的方法有 None、Driver、Auto 和預存程序/函數:

None 在預設狀態下,「訂閱者」通道會假設 Identity Vault 是主索引鍵值的授權來源,且必要值已存在於給定的 <add> 事件中。 在此情況下,因為主索引鍵值已存在,所以不需要再產生。 主索引鍵值只需要從目前的 <add> 事件中取回即可。 當 eDirectory 屬性 (例如 GUID) 明確地綱要映射至父表格或檢視窗的主索引鍵欄時,需要使用此方法。

假設存在名為 usr 的表格和名為 view_usr 的檢視窗,其中 Identity Vault 是主索引鍵值的授權來源,此參數的值會如下所示:

usr(none); view_usr(none)

使用此方法時,建議您將 GUID 而不是公用名稱 (Common Name,CN) 映射至父表格或檢視窗的主索引鍵欄。

Driver 此方法會假設資料庫是指定父表格或檢視窗之主索引鍵值的授權來源。

在建立原型時或在部署的啟始階段,經常需要在寫入預存程序或函數之前,讓「訂閱者」通道產生主索引鍵值。 您還可以針對不支援預存程序或函數的資料庫使用此方法。 然而,當您在生產環境中使用此方法時,<add> 事件產生的所有 SQL 陳述式都應該包含在可序列化的異動中。 如需其他資訊,請參閱異動隔離層級

若不讓所有異動都成為可序列化,您還可以使用內嵌式 SQL 屬性設定個別的異動隔離層級。 如需其他資訊,請參閱異動隔離層級

針對所有數值欄類型,「訂閱者」通道會使用下列方法產生主索引鍵值:

  • 針對 before 時機使用簡單的 SELECT(MAX+1) 陳述式
  • 針對 after 時機使用 SELECT MAX() 陳述式

若為字串欄類型,「訂閱者」通道會使用 System.CurrentTimeMillis() 的傳回值來產生值。 不支援其他資料類型。

假設存在名為 usr 的表格和名為 view_usr 的檢視窗,其中資料庫是主索引鍵值的授權來源,此參數的值會如下所示:

usr(driver); view_usr(driver)

使用此方法時,建議您省略「綱要映射」規則和通道過濾器的主索引鍵欄。

Auto 此方法會假設資料庫是指定父表格或檢視窗之主索引鍵值的授權來源。

部份資料庫支援會針對已插入列自動產生主索引鍵值的身份欄。 此方法會透過 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 參數傳送。

若為預存程序和函數,則參數順序、編號和資料類型必須對應於程序或函數預期之參數的順序、編號和資料類型。

使用此方法時,建議您省略「綱要映射」規則和通道過濾器的主索引鍵欄。

取回時機

「取回時機」參數可指定取回主索引鍵值的時間。

<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 取回時機:內容

內容

標籤名稱

key-gen

必要?

no

區分大小寫?

請參閱未分隔的識別碼區分大小寫

範例值

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

預設值

(無)

正確的值

(符合 BNF 的任何字串)

與綱要相依

True