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 的功能页面。
可以使用 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 时,用户数据不会直接转换为关系表。只有 Domino 中用户数据的内部表示才会转换为表格式。在任何情况下都不应该直接操纵这些表。但是,允许应用程序开发人员通过 Domino Designer 定义他们自己的 DB2 Access 视图。
很多 Domino 内容包含不适合进行关系存储和操纵的消息和协作数据。所以,应用程序开发人员现在可以只选择他们需要进行关系处理的数据/字段。在 Domino Designer 中定义了 DAV 后,就可以创建一个相应的 DB2 视图,并使用来自指定字段的 Domino 数据填充该视图。一旦完成这些操作后,您所有的 SQL 应用程序(如 Crystal Reports)现在就可以通过这个 DB2 视图操作 Domino 数据(参见图 1)。此外,在启用 Domino 安全性功能的情况下,通过 Domino 和 DB2 进行任何更新时,Domino 服务器将负责维护数据完整性。
这个新功能适用于想进行如下操作的用户:
该功能供那些熟悉 Notes 视图的 Domino 应用程序开发人员使用。该功能允许使用 SQL 定义 Domino 视图。通过 Domino Designer,可以定义 Domino 视图,视图的结果集是根据一个 SQL 查询语句得到的。查询视图允许应用程序从以前不能拉入数据的地方拉入数据(通过连接)。数据源可以是其他 DB2 的关系表/视图,或者是其他启用了 DB2 的 Domino 数据库的 DAV。
查询视图是动态的,每当 Domino 视图刷新时将重新执行 SQL 查询(参见图 2)。
这个新功能适用于想进行如下操作的用户:
要与 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 所示。
注意,并未支持一些系统数据库(如 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 视图。
在 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)。
单击 New 创建新的 DAV。在属性框中,将 DAV 命名为 SUMMARY2。在字段列表中插入字段。确保在 DAV 属性框中选中了 All forms 选项。如图 5 所示。这将确保 DAV 中包含全部的文档。保存并关闭 DAV。
要完成 DAV,需要在 DB2 中创建它并进行填充。在 Designer 中 DAV 列表的顶部,单击 Create/Update in DB2 按钮。然后单击 Populate in DB2 按钮。该操作发送一个开始填充 DAV 的请求到 Domino 服务器。注意,如果数据库较大,该操作可能需要一些时间。要查看进度,单击 Refresh Status 按钮(参见图 6)。
当 DAV 可以使用时,在 Designer 中 DAV 名称的左侧将出现一个复选标记,如图 7 中所示。
查询视图是 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)。
单击 Save and Customize 按钮。当视图在 Domino Designer 中打开后,删除 Date 和 Topic 之外的全部列,并在最左侧添加一个用于分类的列,如图 9 所示。
保存视图后,可以通过在 Domino Designer 中视图名称左侧显示的灰色和蓝色图标来区分 SQL 查询视图(参见图 10)。如果将鼠标置于图标上,系统将提示该视图为 DB2 查询视图。
重点:SQL 查询公式的选择语句必须包括视图列中引用的全部字段。
编辑新的查询视图。查看每一个列公式,在一张纸上写下公式中引用的一个或多个字段。例如,我们基于 discussion 数据库中的 All Documents 视图创建了一个查询视图。这些是我们写下的字段:
列 | 字段 |
Categories | Categories 这里我们不使用来自 Categories 字段的数据。该列将是一个由 SQL 查询公式生成的动态列。 |
Date | 没有字段。该类全部使用 @functions。 |
Topic | From AltFrom Readers ExpireDate Subject |
下一步是构造 SQL 查询。SQL 查询最重要的元素是查询语句。选择语句的规则如下:
当在 Domino Designer 中编辑 SQL 查询视图时,一个新的事件(SQL Query)将出现在编程窗格中,如图 11 所示。
可以使用与编写选择公式相同的方式编写 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
这是将关系表(在此例中是 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 中相应的列,因此:
还要注意,来自任何 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)的数据类型相匹配。
此外:
现在可以使用 Notes 客户机查看新的 SQL 视图了。当您打开视图时,状态栏将显示创建的整条选择语句。图 12 显示了刚刚创建的视图。
对于 Domino 7,我们提供了在关系数据库 DB2 中存储 Domino 数据的本机方式。此外,提供了带有两个主要新功能(DB Access 视图和查询视图)的 Domino 应用程序开发环境,以便增强现有的应用程序并基于关系概念开发新的应用程序。
通过本文中提供的提示和示例,我们鼓励所有的 Domino 应用程序开发人员,在开发新的和现有的应用程序时尝试新的功能和开发理念。Domino 数据的关系操作到此结束!
学习
讨论
Debbie Branco 从 1988 年至今一直从事 Notes 方面的工作,起初在 Lotus Notes Quality Assurance 小组测试和编写模板,从 1994 年开始她的主要工作是为 Notes 产品开发模板。她目前从事用于 Mail、Personal Name 和 Address book、TeamRoom、Bookmarks (其中包括 Welcome Page)以及 Personal Journal 的模板方面的工作。