Postgresql 检测PG数据库架构(数据字典)是否已更改

Postgresql 检测PG数据库架构(数据字典)是否已更改,postgresql,Postgresql,是否有一种快速方法可以检测PostgreSQL数据库模式是否已更改?(当PG模式操作(如altertablerun)运行时,是否有一个内部序列或某物会递增)?我想缓存基于模式查询的数据,需要一个无效标记 一种方法是运行模式反射查询(针对pg_类、pg_属性和所有其他查询)并对其生成哈希,但我想知道是否有更简单的方法来实现这一点。它不需要精确,只需要发出信号,说明是时候刷新缓存并在应用程序层中重新加载模式了 澄清一下:这与模式迁移或获取模式差异无关。这只是一个缓存失效标记。这是一个简单的标志:“自

是否有一种快速方法可以检测PostgreSQL数据库模式是否已更改?(当PG模式操作(如
altertable
run)运行时,是否有一个内部序列或某物会递增)?我想缓存基于模式查询的数据,需要一个无效标记

一种方法是运行模式反射查询(针对pg_类、pg_属性和所有其他查询)并对其生成哈希,但我想知道是否有更简单的方法来实现这一点。它不需要精确,只需要发出信号,说明是时候刷新缓存并在应用程序层中重新加载模式了

澄清一下:这与模式迁移或获取模式差异无关。这只是一个缓存失效标记。这是一个简单的标志:“自从标记X以来,模式是否发生了任何变化”。(另外,我谈论的不是模式名称空间,而是数据字典,也就是模式(),也就是数据库结构的更改。)

或者换句话说:是否有使用
PG\u dump的SQLite3
PRAGMA schema\u version

的PG版本 我认为实现这一点的简单(可能是唯一)方法是使用
pg_dump

pg_dump--schema only--schema myschema
然后检测模式是否随转储而更改。您可能希望过滤掉序列。没有用于逻辑复制的PostgreSQL解决方案可与DDL一起使用。

使用
事件触发器
获取具有
架构的行的

模式对象所属模式的名称(如果有);否则为空。不引用

这是一个


有关更多信息,请参阅文档中的。

序列递增并不意味着架构更改。我只是想说清楚。它是一个数据库对象,它持有一个当前值,并且能够生成另一个值。我认为您需要定义模式更改是添加索引还是模式更改?你指的是架构中的任何操作吗?我问的是架构的更改,而不是数据库内容的更改。即ALTER TABLE、DROP TABLE、ADD COLUMN等所有改变数据库结构的操作。大概是创建索引,这些都属于同一个类别。@hhh这是我的想法,但这让我很反感,你能解释一下吗:递增的序列更新了这个问题。不,我不在乎任意序列是否递增,我想知道是否有一些内部序列(pg_,无论什么)在架构更改时递增。您可以保存pg_类,然后在shell脚本中定期比较更改这可能是最简单的方法。但是只查询pg_类等(构成您所反映的内容的内容)并对其生成哈希值要快得多,这种方法甚至更糟糕。我在寻找一个更快的方法:-)也许我的问题不够清楚:-)没有“简单的傻瓜”你必须做一个。模式是一个概念容器,仅此而已。你的问题应该更清楚。为什么这还不够快?为什么您认为在整个模式中重新创建枚举的东西会更快?没有人知道你说的是什么意思。我们知道它的意思。>你的问题应该更清楚。对我来说这看起来很清楚,但我很乐意采纳建议(好吧,任何人都可以编辑这个问题:-)。如果您能抽出时间改进我的问题,我将不胜感激。>为什么这还不够快?我在web界面中显示可用的表/列,因此我想检查每个HTTP请求中的更改。”“不够快”不是问题,我的问题是是否有更快的方法,但要重新询问所有人。>没有人知道你说的是什么意思。真正地schema有不同的含义吗?@hnh是的,您现在定义schema来排除内部序列,但是
--schema
的pg_dump,因为它被定义为非数据实际上包括内部序列。当我们说schema时,我们通常不包括角色,但我使用
ddl_命令_end
的另一个答案包括
GRANT
REVOKE
。无论如何,是的,当你谈论这个问题时,“模式”是一个复杂的术语。我试图通过维基百科链接澄清我在问题中所说的模式是什么意思。我不在乎GRANT/REVOKE或其他产生的一些误报,我仍然可以在那个时候运行哈希检查,而不是每次都运行。我只是不希望标记通过数据库中的常规CRUD操作移动。事件触发器看起来很棒,但我不想仅仅为了这个而去接触实际的数据库和安装触发器。到目前为止,似乎还没有更简单的方式来调查变化。这太棒了!不能解决我的需要,因为我不想触摸/更改数据库,但非常接近我想要的。@hnh您不想通过做您想要的事情的功能触摸或更改数据库。你不想在数据库之外工作,通过那些你想要的功能。你知道没有神奇的布尔值能以你想要的方式实现你想要的。你为什么烦恼?“你知道没有神奇的布尔值能以你想要的方式实现你想要的。”。不,我不知道。这就是我的问题?!这很可能就是结果。也许其他人有另一个想法。