在 postgresql 上维护两个相同的 table 结构
maintaining two table structures the same on postgresql
我们在 PostgreSQL 9.4 中有两个表 A 和 B。我们要确保 A 的列始终是 B 列的子集(即,防止 A 上的 ALTER
来自 adding/dropping/modifying 列,这会使它与 B 不同)。如何实现?
我的猜测是在 ALTER 上使用一种触发器(尽管触发器仅在 CRUD 上发生)或在 A 上使用特殊约束? (尽管每列上的外键似乎有点矫枉过正)。
(用例:B 就像 A 的影子,它会定期接收 A 的记录转储,因此我们要确保如果 A 的结构发生变化,我们不会忘记相应地更改 B )
如您所知,触发器在 CRUD 中。我想也许你可以创建一个触发器,在其中比较每个 CRUD 上的 table 并发出警报。但这只会在进行更改并且有人玩 tableA.
后才会发出警报
您可以为每个 tableB 列到 tableA 列创建多个外键,但这只会在您尝试删除或重命名列、更改字段类型或添加新列您不会收到警报。
@Abelisto 在他的评论中是正确的,在 PostgreSQL 中实现它的一个好方法是使用 Inheritance.
另一种方法是让主人 table 和 "updatable VIEW" (or a view with RULEs...)
我们在 PostgreSQL 9.4 中有两个表 A 和 B。我们要确保 A 的列始终是 B 列的子集(即,防止 A 上的 ALTER
来自 adding/dropping/modifying 列,这会使它与 B 不同)。如何实现?
我的猜测是在 ALTER 上使用一种触发器(尽管触发器仅在 CRUD 上发生)或在 A 上使用特殊约束? (尽管每列上的外键似乎有点矫枉过正)。
(用例:B 就像 A 的影子,它会定期接收 A 的记录转储,因此我们要确保如果 A 的结构发生变化,我们不会忘记相应地更改 B )
如您所知,触发器在 CRUD 中。我想也许你可以创建一个触发器,在其中比较每个 CRUD 上的 table 并发出警报。但这只会在进行更改并且有人玩 tableA.
后才会发出警报您可以为每个 tableB 列到 tableA 列创建多个外键,但这只会在您尝试删除或重命名列、更改字段类型或添加新列您不会收到警报。
@Abelisto 在他的评论中是正确的,在 PostgreSQL 中实现它的一个好方法是使用 Inheritance.
另一种方法是让主人 table 和 "updatable VIEW" (or a view with RULEs...)