2012-03-09 129 views
2

我有一个要求,从一个表镜像插入/更新/删除操作到另一个。 例如,在表A上插入必须复制到tableB中,更新到应用于tableB的tableA,并从tableA中删除应用于tableB。 就像这样简单,除了tableB有一个额外的列为一个常数值,所以非常简单的触发器是必需的。插入/更新/删除或单一触发器更好吗?

我不确定编写3个单独的触发器还是有一个触发器可以执行所有操作。

这是针对3个数据库:Sybase ASE,MSSQL和Oracle,我想让它保持类似的解决方案(对于所有数据库3或3)。

这只是一个偏好问题,有3个触发器与1个,还是对这两种解决方案都有实际好处?

+1

你能否更新tableB的结构,以便它只有对tableA和附加列的引用 - 这种方式只存储一次数据。 – Steve 2012-03-09 18:41:01

+1

你有没有考虑复制? – 2012-03-09 18:44:13

+0

实际上也有tableC,它的操作也镜像到TableB中。附加字段包含有关该行从哪个表复制的信息。我必须查看您发布的建议,但我不确定技术上如何执行这些建议。我希望只有一个表(tableB),并且没有tableA或tableC,但目前这不是一个选项,我们得到了遗留代码更新tableA和tableC。 – Alex 2012-03-09 18:59:01

回答

3

假设你实际上需要一个触发器,并且表B不能简单地定义为表A顶部的视图,或者表B不能简单地使用引用A中的行的外键和常量来定义, A不能被重新定义为添加额外的列(可能具有常量的默认值),一个触发器至少可以让您将所有相关的逻辑保存在一个地方,而不是在您做类似事情时需要更新多个地方为A添加一个新列。但是我会非常小心任何涉及两个不同表反映基本上相同的数据的架构。这违反了规范化,增加了系统的I/O工作量,并且使整个系统更加复杂。

+0

同意所有观点,尽管目前我可以做的不多。希望这张新桌子将成为未来的桌子。谢谢你的答案。 – Alex 2012-03-09 19:57:35

2

当试图确定表A上的操作是什么时,除了触发器执行本身的效率损失之外,分离触发器没有效率。

IE 3单独的触发器可以不使用验证逻辑来​​确定表A中刚发生的事情,因为被触发的触发器本身可以表现在一个泡泡中,因为它知道它是在触发时,它是由于单个操作。

鉴于三合一触发器,您必须检查虚拟删除和插入表的状态,并且每次触发时都会导出操作。

如果您不担心导出“操作”的性能影响(确实很小),或者甚至不需要在表B中知道刚刚在Aable A上发生的“操作”...那么我认为1完全没问题。