如何使用存储过程或其他任何方式获取自动操作的类型(类似于触发器完成的操作), 因为我需要当我(插入或更新或删除)tableA中的记录,或者我需要的tableB 在表C中执行相同的操作,
我不想使用触发因为一些缺点,例如:
所以,我只是想......是否可以通过触发器得到类似的结果? 感谢
答案 0 :(得分:4)
不是直接回答你的问题,而是解决你提到的一些问题:
查看表关系很容易 ,约束,索引,存储 数据库中的过程但触发器是 很难看。
触发器与存储过程一样容易查看。
触发器执行不可见 客户端应用程序。他们 不可见或可以追溯到 调试代码。
真。但在许多情况下,同样进入存储过程并非易事。
很难遵循它们的逻辑 他们可以在之前或之后被解雇 数据库插入/更新发生。
不真实的。触发器在被定义为触发时,在之前或之后触发。
很容易忘记触发器 如果没有文件的话 很难理解 他们存在的新开发者。
如果您使用版本控制,则不真实。
每次触发时都会触发 数据库字段已更新,它是 系统开销。它制造系统 慢一点
写得不好的触发器与编写糟糕的代码一样可能表现不佳。 (但我并不主张过度使用。例如,如果某个动作可以通过约束来满足,则将其用于触发器。)
所有这一切,触发器仍然是一个不错的选择。如果你真的必须在应用程序层中这样做,那就去那里。
答案 1 :(得分:0)
如果确保插入tableA或tableB的所有代码都通过一个公共代码路径,那么你就可以同时插入tableC。
例如,您可以实现一个存储过程,为了将记录插入tableA,所有内容都必须调用 - 作为此sproc的一部分,您只需要包含要插入tableC的操作。
这要求所有代码都经过这个共同点。如果没有,你必须确保无论何时在tableA中完成插入,它都会重复到tableC中。这个可以做更多工作。
这就是为什么触发器很方便,因为它使它自动化。而且您不必确保所有代码路径都执行适当的调用(这在现有/遗留代码库中可能非常棘手)
答案 2 :(得分:0)
您需要撤消用户DML
和A
的{{1}}权限,并仅授予执行存储过程的权限,该存储过程将处理B
的插入。
答案 3 :(得分:0)
感谢所有人的快速回复,,,
我明白使用触发器是一个很好的选择,但我在想,如果:
我在tableC中创建了一个函数(插入/更新/删除),并且可以从任何存储过程调用此函数(插入/更新/删除)tableA和tableB。如果需要更改而不是修改每个存储过程中的代码,这将允许我管理一个函数。此外,我可以在每个存储过程中使用事务来保持所有表中的数据一致。