【发布时间】:2015-05-16 13:31:21
【问题描述】:
一个大型 SQL 事务数据库有 100 多个表(并且还会增长)。其中之一称为Order。然后,还有另一个表 WorkLoad 派生自 Order 和许多其他包含所有活动订单列表的连接表。每次创建订单记录,如果满足一定条件,就应该立即插入到WorkLoad表中。最后,还有第三个表 WorkLoadAggregation,它显示了按日期和商店分组的聚合数据,它完全由 WorkLoad 表构建。 WorkLoadAggregation 还应显示实时数据,这意味着如果在 WorkLoad 表中插入记录,则还应更新匹配的日期/商店聚合。
我的想法是通过以下触发器来处理这个问题:
- 当记录插入Order表中时,触发器调用存储过程将记录插入WorkLoad表中
- 当订单记录被删除触发器从 WorkLoad 表中删除记录
- 当订单记录更新不满足 WorkLoad 条件时,触发器会从 WorkLoad 表中删除记录
- 当记录在 WorkLoad 表中插入/删除/更新时,触发器调用存储过程更新 WorkLoadAggregation 表中匹配的日期/商店聚合记录
在如此大的事务数据库和如此频繁的调用中,我没有使用太多触发器。这种方法有什么不好的吗?我最担心的是“链式触发器”的使用,这意味着一个表上的触发器会激活另一个表上的触发器。我一直在阅读一些文章,其中指出开发人员在使用触发器时应该非常谨慎。有没有更好的解决方案?我应该考虑任何 NoSQL 解决方案吗?
数据库托管在 SQL Server 2012 上。
注意:在案例 5)中,被调用的存储过程包含 CTE(有人建议使用索引视图)
【问题讨论】:
-
如果您使用触发器,请注意以下提示:触发器始终是触发触发器的事务的一部分,并且在您使用回滚或提交时要小心触发器,或者您在触发器中有显式事务。我的意思是,如果您决定在这种情况下使用触发器,请考虑并妥善管理事务,这是我认为的主要提示
标签: sql performance stored-procedures triggers