2017-04-13 94 views
-1

是否有快速檢測PostgreSQL數據庫模式是否更改的方法? (是否有一個內部序列或者當PG架構操作如ALTER TABLE運行時會增加?)?我想緩存基於模式查詢的數據,並需要失效標記。檢測PG數據庫模式(數據字典)是否已更改

一種方法是運行模式反射查詢(針對pg_class,pg_attribute和所有其他模塊)並生成一個散列,但是我想知道是否有更簡單的方法來完成相同的操作。它不需要是確切的,只是表示是時候刷新緩存並重新加載應用程序層中的模式。

澄清:這不是關於模式遷移或獲取模式差異。它只是關於緩存失效標記。這是一個簡單的標誌:「自從標誌X起模式改變了」。 (另外我不是在談論架構命名空間,而是關於數據字典又名架構(database schema)。也就是說,數據庫結構的變化。)

換言之:是否有PG版本的SQLite3 PRAGMA schema_version

+1

遞增的序列並不意味着*模式更改*。只是要清楚。這是一個數據庫對象,它擁有一個當前值並且能夠生成另一個值。我認爲你需要定義*模式改變*是增加一個模式改變的索引?您指的是模式中的任何操作? –

+0

我在詢問有關_schema_的更改,而不是關於數據庫內容更改。即ALTER TABLE,DROP TABLE,ADD COLUMN等,所有操作都會改變數據庫的結構。推測CREATE INDEX和這些屬於同一類別。 – hnh

+0

@hhh這就是我的想法,但這讓我失望了,你能解釋一下嗎:*序列增加* –

回答

-1

使用pg_dump

我覺得容易(可能只)的方式來做到這一點就是緩存架構DIFF使用pg_dump

pg_dump --schema-only --schema myschema 

,然後檢測的模式是否已經與轉儲改變。您可能需要過濾出序列。用於邏輯複製的PostgreSQL解決方案不適用於DDL。

+0

從一個shell腳本中,這可能是最簡單的方法。但是查詢pg_class等(組成你所反映的東西的東西)並對它們產生一個散列是更快的,這種方法更糟糕。我正在尋找_faster_的方式:-)也許我的問題還不夠清楚:-) – hnh

+0

有沒有「簡單布爾」你必須做一個。模式是一個概念容器,僅此而已。你的問題應該更清楚。爲什麼這不夠快?爲什麼重新創建列舉整個模式的東西會更快?當你指* schema *時,沒有人知道你說的是什麼。我們知道'pg_dump'是什麼意思。 –

+0

>你的問題應該更清楚。 它看起來很清楚,但我很樂意合併建議(好吧,任何人都可以編輯問題:-)。如果您能找到改善我的問題的時間,我將不勝感激。 >爲什麼這不夠快? 我在Web界面中顯示可用的表/列,所以我想檢查每個HTTP請求中的更改。 「速度不夠」不是Q,我的問題是是否有更快的方法,但是要重新查找所有的問題。 >當您指* schema *時,沒有人知道您說的是什麼。 真的嗎?對於模式有沒有不同的含義? – hnh

3

使用一個EVENT TRIGGER

一個EVENT TRIGGER on ddl_command_end can be created是得到了行與對象所屬的架構的schema

模式名稱(如有);否則爲NULL。沒有報價被應用。

這裏是一個list of everything ddl_command_end currently fires on

看到文檔的Chapter on Event Triggers以獲得更多信息。

+0

這太棒了!由於我不想觸碰/改變數據庫,但並沒有解決我的需求,但非常接近我想要的。 – hnh

+0

@hnh你不想通過做你想要的功能來觸摸或修改數據庫。您不希望在數據庫之外工作,只需執行您想要的功能即可。你知道沒有不可思議的bool價值能以你想要的方式達到你想要的水平。你在打擾什麼? –

+0

「你知道沒有什麼神奇的bool價值能夠以你想要的方式做你想做的事情。」不,我不知道。因此我的問題?這可能是結果。也許別人有另一個想法。 – hnh