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 资源。
在 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 的管理员所要完成的任务,并超出了本文要讨论的范围。有关这些主题的更详细的信息
一旦满足了这些条件,而且服务器启用了 DB2,那么在服务器上创建的任何数据库都将启用 DB2。可以通过单击 File - Database - Properties,并在数据库属性信息对话框中单击第二个 “i” 附签,快速验证数据库是否启用了 DB2。将会看到 “Database is DB2-enabled”,如图 3 所示。
图 3. 数据库属性显示数据库启用了 DB2
注意,并未支持一些系统数据库(如 Names.nsf 和 Events4.nsf)作为启用了 DB2 的数据库。要获得未被支持的数据库的完整列表,
当数据库启用了 DB2 时,Domino 在 DB2 中将 NSF 存储为一组表。不能查看此数据,因为它是 Domino 的专用数据。只能通过创建 DAV 来打开数据,在 DB2 中查看 NSF 数据。通过 SQL,DAV 可以直接访问数据。使用开放式数据库连接(ODBC)的第三方应用程序可以读取此数据。有关 DB2 Access 视图的详细信息
现在我们将带领您一步步地完成一个示例,该示例展示了如何创建 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 数据的关系操作到此结束!