多个触发器与单个触发器

Dan*_*Dan 8 sql sql-server triggers sql-server-2008-r2

场景:

每次在表格中插入/更新/删除数据时,最多需要做3件事:

  1. 需要将数据记录到单独的表中
  2. 必须对隐式相关数据强制执行引用完整性(我指的是应该与外键关系链接的数据,但不是:例如.当更新Table1.Name也应更新Table2.Name为相同值时)
  3. 任意业务逻辑需要执行

不得更改数据库的体系结构和模式,并且必须使用触发器来完成要求.

哪个选项更好?:

  1. 每个操作(插入/更新/删除)的单个触发器,用于处理多个问题(日志,强制隐式参考完整性,并执行任意业务逻辑).可以命名此触发器D_TableName("D"表示删除).
  2. 每个操作的多个触发器被关注隔离.它们可以命名为:

    • D_TableName_Logging - 用于删除某些内容时的日志记录
    • D_TableName_RI
    • D_TableName_BL

我更喜欢选项2,因为单个代码单元只有一个问题.我不是DBA,对SQL Server足够了解让我变得危险.

是否有任何令人信服的理由来处理单个触发器中的所有问题?

Mar*_*ith 5

在一个触发器中完成这一切可能会更有效,因为您最终可能会减少对(未索引)inserteddeleted表的操作。

此外,当您有多个触发器时,可以设置触发的第一个和最后一个触发器,但任何其他触发器都会以任意顺序触发,因此如果您对特定操作有超过 3 个触发器,则无法确定地控制事件的顺序。

如果这些考虑因素都不适用,那么这只是一个偏好问题。

当然,不用说,使用触发器执行此操作的规范很糟糕。


Ran*_*der 4

哇,你处于一个双赢的境地。谁曾要求通过扳机来完成所有这些事情,应该被枪杀,然后被解雇。通过触发器强制执行 RI?

你说数据库的架构和模式一定不能改变。然而,通过创建触发器,您至少改变了数据库的模式,并且可能会改变体系结构。

我可能会使用选项 #1 并创建额外的存储过程和 UDF 来处理日志记录、BL 和 RI,以便代码不会在各个触发器之间重复(触发器将调用这些存储过程和/或 UDF)。我真的不喜欢按照您在选项 2 中建议的方式命名触发器。

顺便说一句,请告诉您组织中的某人,这太疯狂了。RI 不应通过触发器强制执行,并且业务逻辑不属于数据库。

  • 业务逻辑属于业务想要的地方。 (6认同)