【发布时间】:2012-12-18 04:50:08
【问题描述】:
场景:
每次将数据插入/更新/删除到/从表中/从表中,最多需要发生 3 件事:
- 需要将数据记录到单独的表中
- 必须对隐式相关数据强制执行引用完整性(我指的是应该与外键关系链接的数据,但不是:例如,当更新
Table1.Name时也应该将Table2.Name更新为相同的值) - 需要执行任意业务逻辑
不得更改数据库的架构和架构,必须使用触发器来完成需求。
问题
哪个选项更好?:
- 每个操作(插入/更新/删除)的单个触发器处理多个关注点(日志、强制执行隐式引用完整性和执行任意业务逻辑)。此触发器可以命名为
D_TableName(“D”表示删除)。 -
每个操作的多个触发器按关注点隔离。他们可以被命名为:
-
D_TableName_Logging- 用于记录从 中删除的内容
D_TableName_RID_TableName_BL
-
我更喜欢选项 2,因为单个代码单元有一个关注点。我不是 DBA,对 SQL Server 的了解足以让我变得危险。
是否有任何令人信服的理由可以在一个触发器中处理所有问题?
【问题讨论】:
-
这是一个高交易量的数据库吗?
-
数据库有100个并发用户。
-
我会非常担心由级联触发器引起的性能瓶颈,尤其是在可能有几十个用户同时修改数据库的情况下。
-
"一个函数应该只做一件事"
-
@NeilMcGuigan - 不一定适用于 SQL。我不想为了避免违反 SRP 而在多个不同的触发器中多次扫描同一个表或多次更新同一行中的不同列。
标签: sql sql-server triggers sql-server-2008-r2