IP 和活动以及它们在数据库中的表示方式

在我最近发布了几篇有关如何在注册、安装和取消注册过程中处理集成包 (IP) 的文章(请参阅了解 IP 安装:注册/取消注册/部署/取消部署的实际含义是什么?)之后,作为我将在本周推出的一种新工具的预习资料(尝试制造一点兴奋感),我想更深入地讨论如何安装 IP 和数据库。

我将重点介绍基于工具包的 IP 而不是“本机”IP,这是因为随着 Orchestrator 的向前发展,您会发现我们开发的大多数新 IP 将使用我们的 SDK 来创建并使用 Integration Toolkit 进行打包(就像您要创建的 IP 一样)。使用此工具包确实是创建新 IP 最快且最简单的方式,并且我们将对 SDK 进行一些关键增强,以允许新活动完成我们之前无法完成的任务(这正是我们过去创建非工具包 IP 的原因)。

在注册基于工具包的 IP 时,您将向 Orchestrator 数据库中添加新信息。具体而言,将在 CAPS 表中为集成包创建一个新条目,该条目包含一些有关该 IP 的高级信息。新信息还将添加到 CONFIGURATION 表中,该表存储该 IP 中各项活动的定义以及该 IP 的任何配置类(用于指定选项菜单设置)。该表链接到 OBJECTTYPES 表,后者存储系统已知的所有特定活动类型的关键信息。下面是这些表在 SQL 中的表示形式:

图像

您可能注意到,CAPS 和 CONFIGURATION 表没有以任何方式进行链接。因此,没有任何活动标识符可用于链接到 IP 以说明 IP 中有哪些活动。幸好,我们在 Orchestrator 中进行了一项不同于早期 Opalis 版本的更改,即使用 IP 的产品 ID 的 GUID 将 IP 的所有相关文件放在一个子目录中。此更改的好处在于,此路径现在显示在 CONFIGURATION 表的 DataValue 字段中并且现在变得可供搜索!

例如,如果我想查明哪些活动属于特定 IP,我可以使用如下语句:

  Select * from [Orchestrator].[dbo].[CONFIGURATION]
   Where DataName = 'QIKOBJECT' AND DataValue like '%254FD433-CF28-4402-A785-BCB13AE11876%'

只需插入您要查找的 IP 的正确 GUID,即可返回该 IP 中的活动列表。

执行上述操作时,您会获得活动类型或定义。但如果您想查看使用了这些活动的所有特定实例的列表,该怎么办呢?它有助于了解您创建 Runbook 并向其添加活动时存在的所有表关系。让我们大致看一下:

图像

  • Runbook 包含在 Folders 中(必须存在该文件夹才能创建 Runbook – 默认情况下为根文件夹)。
  • Runbook 具有在您保存 Runbook 时创建的图表 (POLICY_IMAGES)
  • Runbook 具有关联的 Runbook 服务器 (DESIGNATED_ACTION_SERVERS)(如果不是默认服务器)
  • Runbook 包含 Activities (OBJECTS)
  • Activities 可以是特殊的“本机”活动,如通过关联子表 (CUSTOM_START_PARAMETERS) 的“调用 Runbook”(CUSTOM_START),也可以是基于工具包的活动 (QIKOBJECT)
  • Activities 具有关联的操作,如:
    • 循环 (OBJECTLOOPING)
    • 链接 (LINKS),包含导致打开这些链接的条件 (TRIGGERS)
    • 审计 (OBJECT_AUDIT)

了解这些关系有助于您确定如何查询此类内容。例如,如果我想获得 Runbook 中正使用的活动类型的所有实例列表,我可以使用此查询:

  Select * FROM [Orchestrator].[dbo].[OBJECTS]
  WHERE ObjectType IN
  (Select TypeGUID from [Orchestrator].[dbo].[CONFIGURATION]
   Where DataName = 'QIKOBJECT' AND DataValue like '%254FD433-CF28-4402-A785-BCB13AE11876%')

也可以使用 JOIN 通过以下方式表示它:

Select * FROM [Orchestrator].[dbo].[OBJECTS] obj
JOIN [Orchestrator].[dbo].[CONFIGURATION] cfg on obj.ObjectType = cfg.TypeGUID
WHERE cfg.DataName = 'QIKOBJECT' AND cfg.DataValue like '%254FD433-CF28-4402-A785-BCB13AE11876%'

您如何编写此查询完全取决于您的偏好。有时 JOIN 更便于某些人阅读,有时使用另一种方式更方便。当您希望从所查询的多个表而不只是一个表中返回列时,JOIN 很有用。

现在,假设您需要获得正在使用此 IP 中的活动的所有 Runbook 的列表,而不是仅列出活动。这很简单 – 您只需要将查询扩展一下,就像下面这样:

   Select DISTINCT Name FROM [Orchestrator].[dbo].[POLICIES] WHERE UniqueID IN
  (Select obj.ParentID from [Orchestrator].[dbo].[OBJECTS] obj
   JOIN [Orchestrator].[dbo].[CONFIGURATION] cfg on obj.ObjectType = cfg.TypeGUID
   WHERE cfg.DataName = 'QIKOBJECT' AND cfg.DataValue like '%254FD433-CF28-4402-A785-BCB13AE11876%')

我只更改了 OBJECTS 部分以便仅返回 ParentID 列,并使用该列筛选 Runbook 列表(活动的父项),然后在结果中显示 Runbook 的名称。

我将在接下来的几天提供更多这样的示例,但我想再举一例以帮助您入门…

如果您需要包含“已删除”活动(来自此 IP)的所有 Runbook 列表,并显示这些 Runbook 的名称,可采用如下方式:

  Select  pol.Name as [Runbook Name], obj.Name as [Activity Name]
   FROM [Orchestrator].[dbo].[POLICIES] pol
   JOIN [Orchestrator].[dbo].[OBJECTS] obj on pol.UniqueID = obj.ParentID
   JOIN [Orchestrator].[dbo].[CONFIGURATION] cfg on obj.ObjectType = cfg.TypeGUID
   WHERE  obj.Deleted = 1
      AND cfg.DataName = 'QIKOBJECT'
      AND cfg.DataValue like '%254FD433-CF28-4402-A785-BCB13AE11876%'

接下来的几天将会推出更方便的查询和更有用的信息,敬请期待!