Lotus Domino 7 引入了使用 DB2 作為資料存放區的功能。該功能允許使用 DB2 和 Domino 資料庫,訪問和查看以兩種格式儲存的資料。這樣就將這兩個產品的最佳之處帶入了您的環境中。Notes 使用者可以獲得 DB2 的功能,如關係結構和基於 System Query Language(SQL)的視圖。同時 DB2 的使用者可以利用 Domino 的功能,如複製和安全性。
DB2 作為一項可選的儲存功能,允許 Lotus Domino 客戶在企業級關聯式資料庫中儲存他們的訊息和協作的內部表示,維護與 NSF 功能的完全相容性。此外,Domino 7 引入了兩個功能,DB2 Access 視圖(DB2 Access View,DAV)和查詢檢視(Query View),這兩個功能允許 Domino 應用程式開發人員在 Domino 和 DB2 資料上充分利用關係功能。
本文簡要地描述了這兩個視圖是什麼、如何使用它們以及如何開發使用它們的應用程式。我們假定您已經使 Domino 伺服器啟用了 DB2,使其啟動並處於運行中,並對 Domino Designer 有一定的經驗。
註:啟用 DB2 的 Domino 7 通過 DB2 Feature Trial 提供給所有的 Lotus Domino 客戶,僅用作評估(不提供支援)。還有一個 Limited Availability Program 提供給獲得許可的使用者,以使其在提供支援人員的情況下利用 DB2 功能並訪問 IBM Development 資源。有關更多資訊,請參閱 Lotus Domino 和 DB2 的功能頁面。
在 DB2 環境中開發應用程式
可以使用 Domino Designer 構建應用程式,以利用 Domino 伺服器的協作功能,以及 IBM WebSphere 伺服器的交易處理功能和 DB2 資料庫的資料存放區能力。這樣就使應用程式得到一個端對端的業務解決方案,如供應鏈管理、銷售自動化或客戶關係管理。
使用像 Java servlet 這樣的 Jave 技術,可以與 IBM WebSphere 應用程式共用代碼或進行連結。單點登入(Single Sign-On,SSO)—— 一個共用的驗證服務,可以使 Lotus Domino 和 WebSphere 應用程式進一步無縫整合。
如上所述,Domino Designer 7 包括兩個新型的設計項目,協助管理儲存在啟用了 DB2 的 Lotus Notes 資料庫中的資料:
- DB2 Access 視圖(DAV)是一個共用資源,使您能夠為 Lotus Notes 資料定義 DB2 視圖。
- 查詢檢視是新型的 NSF 視圖。該視圖使用 SQL 查詢進行填充。查詢檢視允許在 Notes 視圖中顯示 DB2 資料。如果想基於駐留在 DB2 中的 Notes 資料庫中的資料建立查詢檢視,那麼必須首先定義並填充 DAV。
DB2 Access 視圖
當伺服器啟用了 DB2 時,使用者資料不會直接轉換為關係表。只有 Domino 中使用者資料的內部表示才會轉換為表格式。在任何情況下都不應該直接操縱這些表。但是,允許應用程式開發人員通過 Domino Designer 定義他們自己的 DB2 Access 視圖。
很多 Domino 內容包含不適合進行關係儲存和操縱的訊息和協作資料。所以,應用程式開發人員現在可以只選擇他們需要進行關係處理的資料/欄位。在 Domino Designer 中定義了 DAV 後,就可以建立一個相應的 DB2 視圖,並使用來自指定欄位的 Domino 資料填充該視圖。一旦完成這些操作後,您所有的 SQL 應用程式(如 Crystal Reports)現在就可以通過這個 DB2 視圖操作 Domino 資料(參見圖 1)。此外,在啟用 Domino 安全性功能的情況下,通過 Domino 和 DB2 進行任何更新時,Domino 伺服器將負責維護資料完整性。
圖 1. DB2 Access 視圖概覽
這個新功能適用於想進行如下操作的使用者:
- 將 Domino 資料提供給其他相關的應用程式,如報告工具。
- 有效地使用 SQL 應用程式開發技能操作 Domino 資料。
- 公開 Domino 資料,使其能夠通過合并到其他 Domino 資料庫或 SQL 應用程式將資料集合在一起。
查詢檢視
該功能供那些熟悉 Notes 視圖的 Domino 應用程式開發人員使用。該功能允許使用 SQL 定義 Domino 視圖。通過 Domino Designer,可以定義 Domino 視圖,視圖的結果集是根據一個 SQL 查詢語句得到的。查詢檢視允許應用程式從以前不能拉入資料的地方拉入資料(通過串連)。資料來源可以是其他 DB2 的關係表/視圖,或者是其他啟用了 DB2 的 Domino 資料庫的 DAV。
查詢檢視是動態,每當 Domino 視圖重新整理時將重新執行 SQL 查詢(參見圖 2)。
圖 2. 動態查詢檢視
這個新功能適用於想進行如下操作的使用者:
- 通過標準的 SQL 從其他資料來源拉入資料。
- 基於 SQL 功能在 Domino 資料上建立視圖。
建立查詢檢視
要與 DAV 一起使用查詢檢視,首先要確保 Domino 啟用了 DB2 作為資料存放區,並計劃使用的 NSF 必須儲存在 DB2 資料庫中。同時還必須安裝並正確配置了 DB2 Access 伺服器。此外,任何要訪問查詢檢視的 Notes 使用者都必須具有一個有效 DB2 使用者帳戶,該帳戶必須在部署之前在 Domino Administration 客戶機上進行設定。另外,如果任何 “本地” DB2 資料是通過查詢檢視訪問的,那麼 DB2 管理員必須為 DB2 對象設定適當的許可權。所有的這些前提條件都是 Domino 和/或 DB2 的管理員所要完成的任務,並超出了本文要討論的範圍。有關這些主題的更詳細的資訊,請參閱 Domino 7 Administrator 協助。
一旦滿足了這些條件,而且伺服器啟用了 DB2,那麼在伺服器上建立的任何資料庫都將啟用 DB2。可以通過單擊 File - Database - Properties,並在資料庫屬性資訊對話方塊中單擊第二個 “i” 附簽,快速驗證資料庫是否啟用了 DB2。將會看到 “Database is DB2-enabled”, 3 所示。
圖 3. 資料庫屬性顯示資料庫啟用了 DB2
注意,並未支援一些系統資料庫(如 Names.nsf 和 Events4.nsf)作為啟用了 DB2 的資料庫。要獲得未被支援的資料庫的完整列表,請參閱 Domino 7 Administrator 協助。
當資料庫啟用了 DB2 時,Domino 在 DB2 中將 NSF 儲存為一組表。不能查看此資料,因為它是 Domino 的專用資料。只能通過建立 DAV 來開啟資料,在 DB2 中查看 NSF 資料。通過 SQL,DAV 可以直接存取資料。使用開放式資料庫連接(ODBC)的第三方應用程式可以讀取此資料。有關 DB2 Access 視圖的詳細資料,請參閱 Domino Designer 7 文檔。
現在我們將帶領您一步步地完成一個樣本,該樣本展示了如何建立 DB2 資料庫,以及如何建立您自己的查詢檢視。這裡提供的樣本引用一個使用 Discussion 模板建立的資料庫,該資料庫包含在 Notes 客戶機安裝中。
當為 Domino 資料庫啟用了 DB2 時,Domino 為 DB2 建立一個啟用了 DB2 的資料庫模式,並在模式中建立了一組表用於儲存 Notes 資料庫資料。這個模式基於 NSF 檔案名稱命名。將要建立的所有 DAV 都儲存在該模式中。如果將一個 NSF 檔案中的全部訊息都放在單個 DAV 表中,那麼這對於 SQL 訪問將是無效的。這是因為一組訊息通常不具備一致的欄位(即 DB2 資料庫中的列),因此可能無法以對於 SQL 查詢有意義的方式進行分組。要使 SQL 訪問可用並便於管理,應該通過指定想要使用 SQL 訪問的欄位以及屬於此 DB2 視圖的訊息組(這些訊息構成了 DB2 視圖的行)來定義 DB2 視圖。
步驟 1. 建立 DAV
在 Lotus Notes 客戶機中,要將 Domino 資料拉入到 DB2 查詢檢視中,必須建立 DAV。(只拉入 DB2 資料的 DB2 視圖不需要 DAV。)要在視圖列中顯示的相同的欄位,必須建立為 DAV 中的條目。DAV 佔用大量的空間,因為每個 DAV 都是資料庫中資料的副本,所以建議使用一個(或儘可能少的) DAV 來包含用於不同查詢檢視所需的所有欄位。
寫下在視圖列中引用的所有欄位的名稱。對於本樣本,查詢檢視將使用與 Discussion 中的 All Documents 視圖相似的格式。我們將使用 SQL 查詢公式指定 “動態” 的分類,而不使用訊息自己的分類。我們的欄位列表如下:Form、From、AltFrom、Subject、Readers、ExpireDate。
啟動 Domino Designer 並單擊 Shared Resources 下的 DB2 Access Views 選項(參見圖 4)。
圖 4. 顯示 DB2 Access Views 選項的樣本對話方塊
單擊 New 建立新的 DAV。在屬性框中,將 DAV 命名為 SUMMARY2。在欄位列表中插入欄位。確保在 DAV 屬性框中選中了 All forms 選項。 5 所示。這將確保 DAV 中包含全部的文檔。儲存並關閉 DAV。
圖 5. 顯示選中了 All forms 選項的 DAV 屬性框
要完成 DAV,需要在 DB2 中建立它並進行填充。在 Designer 中 DAV 列表的頂部,單擊 Create/Update in DB2 按鈕。然後單擊 Populate in DB2 按鈕。該操作發送一個開始填充 DAV 的請求到 Domino 伺服器。注意,如果資料庫較大,該操作可能需要一些時間。要查看進度,單擊 Refresh Status 按鈕(參見圖 6)。
圖 6. DAV Refresh Status 按鈕
當 DAV 可以使用時,在 Designer 中 DAV 名稱的左側將出現一個核取記號, 7 中所示。
圖 7. 核取記號表示 DAV 可以使用
步驟 2. 建立查詢檢視
查詢檢視是 Notes 視圖的另外一種類型。和其他類型的 Notes 視圖一樣,查詢檢視是作為 Domino 應用程式一部分的設計項目。查詢檢視使用 SQL 查詢公式來填充資料,而不是使用視圖選擇公式。要基於駐留在 DB2 中的 Notes 資料庫中的資料建立查詢檢視,必須首先為該資料庫定義並填充 DAV(參見步驟 1)。因為查詢檢視不是持久的,所以它們不會佔用 Notes 資料庫空間。不能將現有的視圖轉換為查詢檢視;必須在建立視圖的時候指定該視圖為查詢檢視。
可以通過 SQL 陳述式訪問和操縱 DB2 資料庫中的資料。當在啟用了 DB2 的資料庫中建立一個新視圖時,將出現一個新的選擇條件,稱作 By SQL Query。如果不能立即知道 SQL 查詢公式是什麼,那麼在公式框中輸入雙引號。注意輸入的 SQL 查詢是一個 SQL 查詢公式。
在本樣本中,建立了一個稱作 New SQL view 的查詢檢視。要進行該操作,單擊 Copy From 按鈕並選擇 All Documents 視圖。然後選擇 selection condition 為 By SQL Query,並輸入 "" 作為公式(參見圖 8)。
圖 8. 顯示選中了 By SQL Query 的 Create View 對話方塊
單擊 Save and Customize 按鈕。當視圖在 Domino Designer 中開啟後,刪除 Date 和 Topic 之外的全部列,並在最左側添加一個用於分類的列, 9 所示。
圖 9. 分類列
儲存視圖後,可以通過在 Domino Designer 中視圖名稱左側顯示的灰色和藍色表徵圖來區分 SQL 查詢檢視(參見圖 10)。如果將滑鼠置於表徵圖上,系統將提示該視圖為 DB2 查詢檢視。
圖 10. 視圖名稱旁邊的灰色和藍色表徵圖
步驟 3. 建立 SQL 查詢公式
重點:SQL 查詢公式的選擇語句必須包括視圖列中引用的全部欄位。
編輯新的查詢檢視。查看每一個列公式,在一張紙上寫下公式中引用的一個或多個欄位。例如,我們基於 discussion 資料庫中的 All Documents 視圖建立了一個查詢檢視。這些是我們寫下的欄位:
| 列 |
欄位 |
| Categories |
Categories 這裡我們不使用來自 Categories 欄位的資料。該列將是一個由 SQL 查詢公式產生的動態列。 |
| Date |
沒有欄位。該類全部使用 @functions。 |
| Topic |
From AltFrom Readers ExpireDate Subject |
下一步是構造 SQL 查詢。SQL 查詢最重要的元素是查詢語句。選擇語句的規則如下:
- 整個 SQL 查詢兩側必須加雙引號。
- 要包括視圖列中引用的所有欄位。
- 使用逗號分隔欄位名稱。
- 如果查詢檢視通過 DAV 引用 Domino 資料,並從 DAV 中選擇 #NOTEID,則可以開啟訊息。
- 必須正確參考模式。當 Domino 資料庫儲存在 DB2 中時,資料庫中的資訊包含在駐留於單個 DB2 群組結構的表中,該群組結構被稱作模式。對這些表的所有引用都使用模式名稱加上表名稱,使用句點進行分隔(例如,“schema.table”)。確定啟用了 DB2 的 Domino 資料庫模式名稱的一個簡單快速的方法是使用 @function @DB2Schema,在查詢公式中使用它時,將返回指定的啟用了 DB2 的 Domino 資料庫的 DB2 模式名稱。
- 必須正確引用 DAV。
當在 Domino Designer 中編輯 SQL 查詢檢視時,一個新的事件(SQL Query)將出現在編程窗格中, 11 所示。
圖 11. 編程窗格中顯示新的 SQL Query 事件
可以使用與編寫選擇公式相同的方式編寫 SQL 查詢。下面的代碼是用於構建新視圖的選擇語句,代碼中使用了在第一步中建立的 DISCUSSION_DAV,並基於前面顯示的欄位表。注意,在公式的 SQL 部分不支援硬斷行符號。SQL 陳述式必須是一整段,並在兩側加雙引號。
REM {DB2 schema};MySchema:=@DB2Schema(@DbName);REM {DAV name constructed with schema};MyTable:=MySchema + ".SUMMARY2";"with categorized (categories, #noteid, from, form, altfrom, readers, expiredate, subject) as (select 'Agendas', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '%meeting%' or lcase(subject) like '%agenda%') UNION ALL select 'Backup/Restore', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '%backup%') UNION ALL select 'Performance', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '%performance%') UNION ALL select 'Tools', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '%tools%' ) UNION ALL select 'Admin', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '% db2 %') ) select * from categorized"; |
這就是公式的 SQL 部分,分為下列幾部分:
第一部分稱作 “regular table expression” 。該部分建立了一個名稱為 “CATEGORIZED” 的虛擬表,表中帶有 inner 查詢提供的一組列。每一個 inner 查詢都必須在位置和資料類型方面與這些列相匹配。 "with categorized (categories, #noteid, from, form, altfrom, readers, expiredate, subject) as
- categorized 是指定的表名稱。
- categories 是指定的第一個列的名稱;該名稱將是動態。
- #noteid 如上文中描述的,將其放在這裡是為了能夠開啟訊息。
- from, form.... subject 是將要在視圖查詢中顯示的欄位名稱。
這是將關係表(在此例中是 MyTable 表)中的資料提供給虛擬表 categories 的 inner 查詢之一:
(select 'Agendas', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (subject like '% meeting %' or subject like '% agenda %')
在本例中,使用 UNION ALL 關鍵字將來自該 inner 查詢的輸出與來自其他 inner 查詢的輸出組合在一起:
UNION ALL select 'Backup/Restore', #noteid, from, form, altfrom, readers, expiredate, subject from " + MyTable + " where (lcase(subject) like '%backup%')UNION ALL ... (下一個 inner 查詢) |
inner 查詢中的列直接映射到虛擬表 CATEGORIZED 中相應的列,因此:
- ‘Agendas’ 或 ‘Backup/Restore’ 是映射到虛擬表 categorized 中 categories 列的值。注意本例中的這些文字值是動態。在 SQL 語言中可以從任何的運算式派生這些值。
- from, form... subject 是將要顯示的欄位。這些欄位必須在位置和資料類型方面與虛擬表 CATEGORIZED 中的列相匹配。
還要注意,來自任何 inner 查詢的選擇語句都能夠從任何具有其他列名的其他表中拉入列,但是首先必須保證所選列的資料類型必須同虛擬表 CATEGORIZED 列的資料類型相匹配。下面是一個例子:
(select 'Somewhere Else', foreign_noteid, somefrom, myform, youraltfrom, the_readers, the_expiredate, topic from " + AnotherTable + "where topic like '% this isn't that hard, really %') |
這裡 foreign_noteid、somefrom、myform、youraltfrom、the_readers、the_expiredate 和 topic 都與虛擬表 CATEGORIZED 中的列(這些列為#noteid、from、form、altfrom、readers、expiredate、subject)的資料類型相匹配。
此外:
- UNION ALL 是將所有選擇語句串連起來的關鍵字。它使來自所有選擇語句的資料作為單個流顯示到視圖。這是可以從多個 NSF 甚至其他表選取資料到查詢檢視的一種方式。另一種方式是通過連接。
- select * from categorized 是最後一個查詢語句。如果把所有的內容拼字出來(不使用*萬用字元),那麼這個語句是 select categories, #noteid, from, form, altfrom, readers, expiredate, subject。
現在可以使用 Notes 客戶機查看新的 SQL 檢視了。當您開啟視圖時,狀態列將顯示建立的整條選擇語句。圖 12 顯示了剛剛建立的視圖。
圖 12. 新建立的 SQL 檢視
結束語
對於 Domino 7,我們提供了在關聯式資料庫 DB2 中儲存 Domino 資料的本機方式。此外,提供了帶有兩個主要新功能(DB Access 視圖和查詢檢視)的 Domino 應用程式開發環境,以便增強現有的應用程式並基於關係概念開發新的應用程式。
通過本文中提供的提示和樣本,我們鼓勵所有的 Domino 應用程式開發人員,在開發新的和現有的應用程式時嘗試新的功能和開發理念。Domino 資料的關係操作到此結束!
參考資料
學習
- 您可以參閱本文在 developerWorks 全球網站上的 英文原文 。
- developerWorks:Lotus 文章,“Lotus Domino 7.0 中的新特性”,包含有關在 Notes/Domino 7 整合 DB2 的其他資訊。
- Lotus Domino 和 DB2 功能頁面 是有關 Domino/DB2 整合資訊的另一個極好的資源。
- 還可以訪問 Lotus Domino 7 Administrator 協助 獲得有關該功能的更多資訊。
討論
- 參與論壇討論。
- 通過參與 developerWorks blogs 加入 developerWorks 社區。
作者簡介
Debbie Branco 從 1988 年至今一直從事 Notes 方面的工作,起初在 Lotus Notes Quality Assurance 小組測試和編寫模板,從 1994 年開始她的主要工作是為 Notes 產品開發模板。她目前從事用於 Mail、Personal Name 和 Address book、TeamRoom、Bookmarks (其中包括 Welcome Page)以及 Personal Journal 的模板方面的工作。
Tom McGary 自 1970 年開始就從事軟體領域的工作,從 1988 年開始在 IBM/Lotus 工作,自 1999 年開始從事 Lotus Notes 方面的工作。除了從事 Notes 複製和啟用了 DB2 的 Domino 部署,以及啟用了 DB2 的 Domino 的各個方面工作外,他還是 D.N.R.C Side Effeçts 的 Miñister。
Wai-ki Yip 是啟用 DB2 的 Domino 資料庫方面的開發主管。他已經在 Lotus Development 工作了 18 年,自從 1995 年開始就從事 Domino 方面的工作