“Tivoli 资产管理”是作为生命周期管理的管理工具而设计的。在该文档中,该产品的体系结构是在数据库级别上访问的,应用程序编程接口(API)是为定制目的而提供的。
无论是通过包含相关数据的单个表还是通过一组表访问数据,都要通过称为 'DB_TRAN'(数据库处理)的类属函数来管理。各个表都具有更新记录列表的函数调用,以及检索给定搜索子句的记录列表的读取函数。例如:
FUNCTION UpdateListOfContractTypes(VAL InTran: Boolean,REF BeforeList: LIST OF ContractTypes, REF AfterList: LIST OF ContractTypes) : INTEGER;
SQL 语句使用 InTran 函数以标识结果是否应当认为是事务的一部分。下面是一般的应用程序指导。
代码地区 | InTran |
从用户接口事件组中检索隐藏主键的计数值。 | FALSE |
检索隐藏主键(一般)的计数值。 | TRUE |
从用户接口事件组中添加记录(计数检索作为 InTran = TRUE 的子集) | FALSE |
更新记录列表(在 InTran 等于 TRUE 时单个插入、删除、更新) | FALSE |
UpdateListsofRecords 组(例如,“移植”) | TRUE |
BeforeList 和 AfterList 代表记录列表。两个列表需要同步化,以使各个列表中的相同元素代表事务之前及之后的记录状态。
事务 | 状态之前 | 状态之后 |
插入 | 空(空白) | 具有数据的记录 |
更新 | 具有旧数据的记录 | 具有新数据的记录 |
删除 | 具有数据的记录 | 空(空白) |
用于信息检索的函数的实例是:
FUNCTION GetSomeContractList(REF kList: LIST OF ContractRec, VAL where: STRING): INTEGER;
该记录列表包含匹配在 where 子句中指定的搜索准则的记录。在函数中嵌入了表名称,所以只有 where 子句需要作为参数传送。返回值指示查询的成功或失败。
“Tivoli 资产管理”的公用 APIs 是在 TSD 脚本程序 KB 文件集中定义的,此文件以'i_db'前缀标识。一个文件可能包含多个表的引用。典型情况是,该集合数据库处理文件包含访问和更新相关表中记录的方法。下列实例是从 i_db_hst.kb 文件中摘录的:
KNOWLEDGEBASE I_DB_HST;
USES I_RECORD; -- 记录 defns I_NXTNUM; -- I_GetNextNumber I_STRING; I_DB_TRN; -- 错误定向函数 SERVICES;
CONSTANTS
TYPES
VARIABLES hstEventList: LIST OF EventRec;
ROUTINES ------------------------------------------------------------ -- PUBLIC - EVENTS ------------------------------------------------------------
FUNCTION UpdateListOfEventRec(VAL InTran: Boolean, REF BeforeList: LIST OF EventRec, REF AfterList: LIST OF EventRec): INTEGER;
FUNCTION GetEventID(VAL Event_name: STRING): INTEGER;
FUNCTION GetEventName(VAL Event_id: STRING): STRING;
FUNCTION GetEventList(REF ktypeList: LIST OF EventRec, REF EventNameList: LIST OF STRING): INTEGER; ------------------------------------------------------------ -- PUBLIC - HISTORY ------------------------------------------------------------
FUNCTION InsertHistRec(VAL InTran: Boolean, REF InsertRec: HistRec): INTEGER;
FUNCTION UpdateListOfHistRec(VAL InTran: Boolean, REF BeforeList: LIST OF HistRec, REF AfterList: LIST OF HistRec): INTEGER;
FUNCTION GetInvHist(REF histList: LIST OF HistViewRec, VAL is_inventory_id: INTEGER): INTEGER;
FUNCTION GetSomeInvHist(VAL where: STRING, REF lst: LIST OF HistViewRec): INTEGER;
FUNCTION GetHist(REF lst: LIST OF HistRec, VAL iid: INTEGER): INTEGER;
可以为各个分类定义一个属性可变长度列表。在相关的数据库中实现该概念要求在单个表中属性不作为列使用,而是作为多相关记录描述各个属性。
处理属性的 APIs 在 i_db_atr.kb 文件中维护。
“Tivoli 资产管理”允许用户维护对与资产分类相关联的属性缺省值的引用。可以以某种设备类型为基础,使用想要跟踪的特定固定特征设计模型。这些特征称为属性。例如,在称为“监视器”的资产分类中,可以定义称为 NEC 3FGe 的模型,有一个属性叫做“大小”,缺省值为 14。因此任何分类为 NEC 3FGe 监视器的资产都有与之相关联的大小值 14。
同一分类中的全部模型具有同一属性,但是可以指定以模型为基础的不同缺省值。如果一个值可以描述为销售特征(非选项),那么应当将其作为缺省值对待。
由于可以将资产与资产分类相关联,并且和类别中的任何模型相关联,所以 API 提供访问和更新全部相关表的机制。用来执行这些更新的 API 的集合广泛分布在“Tivoli 资产管理”的应用程序中。
使用 API 要求熟悉数据库结构及有关的数据库完整性(RI)。数据库结构要求按顺序次序执行特定记录更新以维护数据库完整性 RI。例如,要在新的资产分类中插入资产记录,用来创建记录的 API 必须按照下列顺序:
i_asset.kb 文件中的单个函数执行全部相关表的更新顺序。
FUNCTION UpdateListOfInventoryItems(VAL InTran: Boolean, REF updateList: LIST OF InvUpdateRec): INTEGER;
UpdateList 是记录结构的列表,它包括更新进程中作为记录的嵌套子列表的全部数据。返回值指示成功或失败。
在“Tivoli 资产管理”中,主键对用户是隐藏的。例如,当用户添加资产时,自动植入 is_inventory_id 字段(主键)。用户指定的资产标记实际上是备用单独键。
主健值是自动指定的通常是 COUNTERS 表中的整数。对于数据管理器或分级表,如 ORGANIZATION_TREE 表,主键是代表父表中相关记录的整数值的字符串。
LOCATION 表和 VENDOR 表不使用主键。
其它的以备用键为基础检索单个记录的函数是 API 的一部分。这些函数已定义,如下例:
PROCEDURE GetContractType( REF type_id: INTEGER, REF contract_type: STRING);
在该过程中,返回的类型标识有第二个参数合同类型的备用键。
“Tivoli 资产管理”数据管理器使用称为有向非循环图或简称 DAG 的数据结构。DAG 为有箭头的部分树和部分图,其箭头总是指定向一个方向。没有循环或回路。有关 DAG 的详细信息,请参见下列内容:
Algorithms in C, Robert Sedgewick, Addison-Wesley 1990, ISBN 0-2-1-51425-7, p.
479 (Topological Sorting)
Fundamental Algorithms, Donald Knuth, Addison-Wesley 1973, p. 371 (Directed
Graphs)
下列表是使用 DAG 方法构造的:
“Tivoli 资产管理”在 i_br_gl.kb 文件中包含一个称为 CheckCircularity 的函数,该函数检测并阻止 DAG 表中的循环。
“Tivoli 资产管理”使用下列 KB 文件以实现 DAG 数据结构:
i_browsr.kb: 通过用户接口和有基础表的事务处理剪切和粘贴。
i_br_gl.kb: 显示树的展开版本。
“Tivoli 资产管理 DAG”允许节点具有多个父节点。
在该实例中,每当通过节点 C 或 E 的路径交叉时列出节点 D。由于节点 D 具有两个父级,当通过节点 C 或 E 交叉时,更改到节点 D 也可见。
“Tivoli 资产管理”分层允许复制节点命名。
在该实例中,两个 D 节点是不同的,分离具有相同名称的记录(例如“场所”管理器中的“第二层”。修改一个记录不会影响第二个。