我有一张表,可用于根据提供的条件确定操作。这就是现在的样子。
IPAddress, MACAddress, Hostname, ScriptName, Argument1, Argument2, Argument3
10.2.1.* , .* , .* , diagnostics.sh, -runAll, ,
在此表中,前三列是条件,后四列是操作。条件单元格的值是我在其上执行 REGEX_LIKE 的正则表达式值,因此当我查找要在设备上运行的正确脚本时,我会查看它的 IP(或 MAC,我得到一个或另一个,而不是两个)并且主机名,如果正则表达式匹配,那么我会得到需要运行的脚本名称和该脚本的参数。
有些脚本只有一个参数,有些有两个,还有一些有三个。
我该如何修改它以便我可以任意列出条件和操作。例如,我得到了条件的键、值映射(属性名称、属性值),一旦满足规则,我就会检索与该设备相关的操作键、值元素列表。
为简单起见,初始化后不会对该数据库进行任何更新。它在启动时通过从平面文件中读取规则进行初始化,并在运行时用于确定已满足所提供输入的规则。
这是我认为更适合这个的模式,但我不知道这是否正确,我也不知道如何获得匹配规则。
Table Name: Column List
Attributes: attributeId, name, value
Conditions: conditionId, ruleId, attributeId
Actions : actionId, ruleId, attributeId
Rules : ruleId
数据库
我不确定您为什么要为此使用正则表达式。PostgreSQL 已经有特定的类型。
不要将 ip、网络掩码或 macaddresses 存储为文本。
我不太明白你想做什么。我还会向您指出ip4r,它在这方面非常棒。
至于存储条件,我不完全确定你的意思,但你当然可以将条件存储为 inet 有一组丰富的运算符
我自己想出来了。我将描述我自己编写查询所做的工作。我没有要粘贴的查询,因为我删除了查询,因为我不再需要它了,但是如果有人需要它,请给我发消息,我会重新编写它。
我创建了两个表,Rule(Id, Name) 和 Parameter(Id, Key, Value, RuleId, Type)。
规则表是不言自明的,参数表有两种类型的参数用于每个规则,一个条件或一个动作。每个规则都应具有任意数量的条件和操作。条件参数应具有正则表达式以涵盖 IP 子网或主机名约定等
然后我创建了一个 SQL 查询来获取每个规则的条件总数,以及一个 SQL 查询来获取与用户提供的输入相匹配的条件总数;例如,如果条件包括主机名、IP、building_name,我会使用 regex_like 获得这些条件匹配的规则列表,然后我对 ruleId 进行计数并将其与先前对计数和 ruleId 的查询结合起来。这为我提供了满足所有条件的 ruleId 列表,从中我可以查询参数表以获取该规则的相应操作列表。