SQL触发器与服务器端查询

时间:2012-10-09 19:16:32

标签: sql database triggers webserver sql-update

案例:我有一个表T1通过表单保存提交的记录。在更新此表上的记录时,我想在表T2中插入一行。

对于这种情况,以下方案的性能如何比较?

场景A:AFTER UPDATE ON T1触发器构建并插入相关行。由于T1没有引用T2,因此可以。

方案B:服务器端服务层(PHP,python,无论如何)在进行更新后插入相关行。

场景C:这将是存储过程,但是SP和触发器有很多比较,因此您不必包含它们。

4 个答案:

答案 0 :(得分:4)

我真的不喜欢触发器。问题在于它们本质上是副作用,因此对于系统的未来维护者而言往往是隐藏的并且不明显。他们后来导致错误的代码。除非你有特定的数据显示这个特定用例的性能瓶颈,否则我更希望看到存储过程或“PHP,python,无论什么”服务层来处理对数据库的所有访问。永远不要忘记正确性胜过性能这一事实。

答案 1 :(得分:2)

鉴于触发器和python之间的选择,我会选择触发器。对数据的触发确保T2包含T1的记录,无论数据是如何插入的,而不是依赖于应用程序,从而确保数据的完整性。如果添加另一个将记录添加到T1的应用程序,使用触发器,T2仍然会插入记录。

我不知道你为什么要折扣存储过程,也不知道你认为触发器更快或“更适合数据库服务器的性质”

答案 2 :(得分:1)

如果您可以保证数据始终只在T1通过您的应用程序更新,我会投票支持在代码中执行此操作(PHP / Python或存储过程)。如果有可能以另一种方式更新数据(DBA编写查询,也许?),那么请使用触发器来保证您获得预期的一致结果。

答案 3 :(得分:0)

无论使用触发器和/或存储过程,您的SQL代码都是经过预编译和优化的。我怀疑是否有显着的性能优势。正如其他人所指出的那样,在更新表上的多个记录时,触发器可能会导致意外的性能问题,或者创建难以管理的更新链。

重构和维护存储过程比触发器链更容易。