2017-04-13 92 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