【问题标题】:Create TABLE in many Postgres schemas with a single command使用单个命令在许多 Postgres 模式中创建 TABLE
【发布时间】:2014-05-11 22:04:41
【问题描述】:

我的 Postgres BOOK 数据库中有两个模式,MSPRESS 和 ORELLY。 我想在两个模式中创建同一个表:

CREATE TABLE MSPRRESS.BOOK(title TEXT, author TEXT);
CREATE TABLE ORELLY.BOOK(title TEXT, author TEXT);

现在,我想用一个命令在我的所有模式中创建同一个表。

为了实现这一点,我考虑了 Postgres 9.3 (http://www.postgresql.org/docs/9.3/static/event-triggers.html) 中可用的事件触发器。通过我的事件触发器拦截 CREATE TABLE 命令,我想确定在其中创建它的表和模式的名称,并对所有可用模式重复相同的命令。可悲的是,事件触发过程没有得到正在创建的表的名称。

有没有办法“实时”同步 Postgres 架构?

【问题讨论】:

  • 您是否考虑过 plgpsql 中的 DO 块,对模式进行迭代?这是 SQL 客户端的单个命令。

标签: postgresql events triggers synchronization schema


【解决方案1】:

目前only TG_EVENT and TG_TAG 可通过事件触发器获得,但此功能可能会扩展。同时,您可以查询information_schema 的差异并尝试添加缺少的每个表;但是不要忘记这个同步也会触发多个事件触发,所以要小心操作。

但是,如果您只想构建具有相同结构的多个模式(无需进一步同步),您可以编写无模式查询来构建它们并在更改 search path 后在每个模式上逐个运行它SET search_path / SET SCHEMA

【讨论】:

  • 检查 information_schema 可能是 CREATE TABLE 的解决方案,但对于 ALTER TABLE 它是模棱两可的。我希望一个方案中的所有 DDL 命令(CREATE、ALTER、DROP)都反映在所有模式中。
  • 但是,没有其他方法可以做到这一点。 information_schema 是您在事件触发器扩展之前的最佳选择。除非你可以用 parsetree 中的 C postgresql.org/docs/9.3/static/event-trigger-interface.html 做讨厌的事情
  • 做坏事的例子?
  • C 中编写一个事件触发器,您可以在其中拥有 DDL 的整个解析树(点击链接)。不过比查询information_schema 好不了多少。
  • 我已经关注了。例如,CREATE TABLE 的解析树看起来如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多