Database-Recommendation

基於SQL的Regex規則引擎

  • December 7, 2017

我有一張表格,用於根據提供的條件確定操作。這就是它現在的樣子。

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

這是我自己想出來的。我將描述我為自己編寫查詢所做的工作。我沒有要在此處粘貼的查詢,因為我刪除了查詢,因為我不再需要它,但是如果有人需要它,請給我發消息,我會重新編寫它。

我創建了兩個表,Rule(Id, Name) 和 Parameter(Id, Key, Value, RuleId, Type)。

規則表是不言自明的,參數表對於每個規則有兩種類型的參數,一個條件或一個動作。每個規則都應該有任意數量的條件和動作。條件參數應具有覆蓋 IP 子網或主機名約定等的正則表達式

然後我創建了一個 SQL 查詢來獲取每個規則的條件總數,並創建一個 SQL 查詢來獲取與使用者提供的輸入匹配的條件總數;例如,如果條件包括主機名、IP、building_name,我會使用 regex_like 獲得這些條件匹配的規則列表,然後我對 ruleId 進行計數,並將其與上一個關於 count 和 ruleId 的查詢連接起來。這給了我滿足所有條件的 ruleIds 列表,從中我可以查詢參數表以獲取該規則的相應操作列表。

PostgreSQL

我不確定您為什麼要為此使用正則表達式。PostgreSQL 已經有特定的類型。

CREATE TABLE whatev (
 IPAddress  inet,
 MACAddress macaddr,
 Hostname   text,
 ScriptName text,
 CHECK ( IPAddress IS NULL OR MACAddress IS NULL )
);

INSERT INTO whatev
VALUES ( '10.2.1/24', null, 'Evan Box', 'rmrf' );

不要將 ip、網路遮罩或 MAC 地址儲存為文本。

SELECT * FROM whatev
WHERE ipaddress >> '10.2.1.4';

我不太明白你想做什麼。我還會向您指出ip4r,它在這方面非常出色。

至於儲存條件,我不完全確定您的意思,但是您當然可以將條件儲存為 inet 有一組豐富的運算符

引用自:https://dba.stackexchange.com/questions/189462