我不知道它是如何可能改變你處理你的配置的方式,但我們通過使用本地覆蓋的想法實現了類似於此的東西。具體而言,您有兩個相同的配置表(稱爲CentralConfig和LocalConfig)。 CentralConfig維護在中心位置,並複製到您的衛星位置,在該位置只讀。 LocalConfig可以在本地站點建立。查詢配置數據的過程首先在LocalConfig表中查找數據,如果找不到,則從CentralConfig表中檢索它。
例如,如果你想與V $參數表中的值要做到這一點,你可以使用FIRST_VALUE函數在SQL分析查詢您的配置:
SELECT DISTINCT
NAME
, FIRST_VALUE(VALUE) OVER(PARTITION BY NAME
ORDER BY localsort
) VALUE
FROM (SELECT t.*
, 0 localsort
FROM local_parameter t
UNION
SELECT t.*
, 1 localsort
FROM v$parameter t
)
ORDER BY NAME;
的localsort列工會是否只是爲了確保local_parameter值優先於v $參數值。
在我們的系統中,它實際上比這更復雜。除了您正在查找的參數的「名稱」之外,我們還有一個「上下文」列來描述我們正在尋找的上下文。例如,我們可能有一個集中設置的參數「超時」,但即使在本地,我們也有多個使用此值的組件。它們可能都是一樣的,但我們也可能想要以不同的方式進行配置。所以當工具查找「超時」值時,它也受到範圍的限制。在配置本身,我們可以使用通配符時,我們定義我們所希望的範圍,如:
CONTEXT NAME VALUE
------------- ------- -----
Comp Engine A timeout 15
Comp Engine B timeout 10
Comp Engine % timeout 5
% timeout 30
上面的配置表示,所有組件,使用30超時,但對於任何類型的比較引擎,請使用5的超時,但對於Comp Engines A & B,請分別使用15 & 10。最後兩個配置可以保持在CentralConfig,但其他兩個可以在LocalConfig維持,你會解決的設置是這樣的:
SELECT DISTINCT
NAME
, FIRST_VALUE(VALUE) OVER(PARTITION BY NAME
ORDER BY (TRANSLATE(Context
, '%_'
, CHR(1) || CHR(2)
) DESC
, localsort
) VALUE
FROM (SELECT t.*
, 0 localsort
FROM LocalConfig t
WHERE 'Comp Engine A' LIKE Context
UNION
SELECT t.*
, 1 localsort
FROM CentralConfig t
WHERE 'Comp Engine A' LIKE Context
)
ORDER BY NAME;
它基本上是相同的查詢,但我將那個翻譯表達式在我的localsort之前,我約束上下文。它所做的是將%和_字符轉換爲chr(1)& chr(2),這將使它們按字母數字字符按降序排序。這樣,明確定義的「Comp Engine A」將出現在「Comp Engine%」之前,而「Comp Engine%」則會出現在「%」之前。在上下文定義相同的情況下,本地配置優先於中央配置;如果你希望本地永遠佔據中心位置,即使在中央的範圍更緊的情況下,你也只需要顛倒兩個排序項的位置。