【问题标题】:Why should we not include business logic in database triggers?为什么我们不应该在数据库触发器中包含业务逻辑?
【发布时间】:2019-05-22 10:28:53
【问题描述】:

我公司的业务部门希望实施 20 个具有非常具体业务逻辑的新触发器。他们还不断地对旧触发器进行更改。逻辑只是 99% 的时间取决于参数的组结构。

我已经一次又一次地尝试阻止这种情况,但他们现在已经习惯了这个过程并期待它。如果我不同意,我会被告知我仍然必须实施这些。

我需要用非技术术语向他们概述,让他们理解为什么我们不应该实现这些触发器并将这些任务转移到我们的应用程序中开发。

到目前为止,我已经告诉他们:

  1. 数据丢失/覆盖的风险极高
  2. 以美元为单位的高 DB 成本
  3. 可以通过应用程序自动化的不必要的工作

还有其他项目可以添加到此列表中吗?

如果这里不适合提出这个问题,我们深表歉意。

谢谢!

  1. 数据丢失/覆盖的风险极高
  2. 以美元为单位的高 DB 成本
  3. 可以通过应用程序自动化的不必要的工作

【问题讨论】:

  • 代码质量检查通常比数据库更容易

标签: sql database triggers


【解决方案1】:

您给出的三个原因是错误的,并且背叛了纯编码员的观点:

  1. 数据丢失/覆盖的风险极高

    (如果你的东西是用一种碰巧没有命名为 SQL 的语言编码的,你就没有这种风险?)

  2. 以 $ 为单位的高 DB 成本

    (如果你的东西是用一种碰巧没有命名为 SQL 的语言编码的,你就没有这种风险?)

  3. 可以通过应用程序自动化的不必要的工作

    (用一种碰巧没有命名为 SQL 的语言自动化你的东西不是一个涉及进行分析和编写实现代码的过程?)

触发器是一种有用的构造,至少有一个目的:针对 SQL 以声明方式不支持的所有完整性规则保护数据完整性。有关详细信息,请参阅“数据库专业人员的高级数学”,第 11 章。

所有这一切:设计师应该注意将 [执行] 代码附加到例如 INSERT INTO CUSTOMER 的原因是“只有在我们注册新客户时才会发生这种情况,并且所有新客户都应该收到一封欢迎信(或一些这样的)”。考虑您接管另一家公司,其所有客户都将集成到您的数据库中。哎哟。触发器的不良使用通常可以追溯到“过于急切地将业务意义附加到正在发生的数据库操作上”。这个特殊的东西确实属于“业务事务/业务功能”编码的部分,可能是应用程序代码,或者可能是可调用的存储过程(与触发器不同)。

【讨论】:

  • 您好,感谢您的意见。 1. 是的,这是用 SQL 编码的,但是一个触发器总是有可能影响另一个触发器,或者新的软件实现可能会受到触发器的负面影响。 2. 我们需要增加 DTU 以保持相同的 DB 性能。这是因为每次将数据添加到带有触发器的表时,它都必须查询数据库以获取某些逻辑。 3. 如果在我们的软件中实现了一项功能,可以处理场景中的组结构,则 99% 的触发器将被消除。
  • 我知道什么时候应该使用触发器,但是,我不同意它们应该在可以在相应应用程序中涵盖的非常具体的业务逻辑下使用。
  • 所有逻辑“可以在应用程序中覆盖”。这使得该特征成为非区分标准。这不是这样做的正当理由。事实上,它是错误放置数据完整性逻辑的地方(并且数据完整性逻辑确实是业务逻辑的一种形式)。我不知道你的“场景”或“组结构”是什么,更不用说“照顾他们”是什么意思了,所以我无法进一步评论。
  • 补充一点:为什么“业务方面”显然会决定在相当明确的问题上技术实施方面 ???
【解决方案2】:

真的不喜欢业务逻辑的触发器,所以这可能更像是一个咆哮而不是答案......

  1. 触发器会产生性能问题和锁定的风险。没有什么可以阻止您编写具有可怕性能特征的触发器,或者更有趣的触发器来触发触发原始触发器的其他触发器。

  2. 触发器是“副作用”,对于大多数人来说,副作用通常会导致错误。例如,如果有人正在编写用于持久化新业务实体的代码,并且该代码导致触发触发器,他们可能不会在其代码中考虑这一点,从而导致错误。

如果你的回答是“好吧,不要做那些事”:

  1. 触发器真的很难测试。您必须测试可能导致触发器触发的每条路径,而在非平凡的应用程序中,这通常是不可能的。

【讨论】:

  • 谢谢,我会将这些添加到我的列表中。
  • 1.与将相同的进程编码为应用程序的一部分并不构成差异,因此这不是一个论点。 2. 不正确:触发器仅在从其中完成更新时才会产生副作用。反对副作用的论点是有根据的,但完全避免触发的结论则不然。 “数据库专业人员的高级数学”(De Haan/Koppelaars)详细展示了使用触发器的完全合理的案例。 3. 错误原因与 1. 相同:将其移至应用程序代码不会解决测试问题。
  • 如果您的论点是“使用触发器实现数据完整性”,我同意您的看法,但问题是关于将触发器用于业务逻辑。我已更新我的答案以明确包含该警告。
猜你喜欢
  • 2011-01-08
  • 2010-10-10
  • 1970-01-01
  • 2011-08-14
  • 2016-11-20
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多