明智地使用触发器来更新另一个表吗?


8

我有一个Object表,该表是从另一个数据库的集成服务(可以根据需要更改的表)填充的。在某些时候,我们需要手动在另一个表中添加帖子,ObjectObjectGroup (ObjectId, ObjectGroupId)如果帖子中Object.ObjectType有某个整数值,则需要添加。由于集成服务无法处理这种更新,因此我正在考虑向Object表添加一个触发器,该触发器用伪代码如下:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

这是明智的设置,还是在性能方面有更好的方法?

Answers:


9

通常是在Stackoverflow上复制/粘贴我对此问题的回答

触发器可能非常诱人,当您首次开始使用它们时,它们似乎是解决各种问题的灵丹妙药。但是,它们使“神奇”的事情发生了,如果您不知道数据库由内而外的话,似乎真的发生了奇怪的事情(例如插入其他表,更改输入数据等)。在将事物实现为触发器之前,我会认真考虑改为在架构周围强制使用API​​(最好在数据库中使用,但如果不能,则在外部)。

有些事情我仍然会使用触发器

  • 跟踪“ date_created”和“ date_last_edited”字段
  • 插入“ ID”(在Oracle中没有自动ID字段)
  • 保持变更历史

您不想使用触发器的事情

  • 业务规则/逻辑
  • 连接数据库外部的任何内容(例如,Web服务调用)
  • 访问控制
  • 任何非事务性的内容(您在触发器中所做的任何事情都必须能够回滚事务)

4

是的,这是明智的。实际上,这就是触发器的目的,它是在对表执行插入/更新/删除操作之后执行所需的操作。

您需要考虑以下事实:MS SQL中的触发器不会单独处理每一行,而是会立即处理当前事务的所有行。因此,如果一个操作一次插入10行,则需要考虑触发器的代码一次处理所有行。


1
只要填充数据库的服务不能满足该人的全部需求,并且只要他不能更改服务(这就是我对描述的感觉),问题就在DBA.SE上,而不在程序员上,我会说,有充分记录的触发器应该没有问题。他说他是手动做一些事情,所以根据我的理解,代码更改不会涉及
Marian

1
在这种情况下,这可能是唯一可行的选择,但这并不明智。明智的做法是推回应用程序开发人员,并让他们正确地插入两个表中。
马修·沃森

咳嗽。我知道这是前进的方向。很抱歉在上面我的问题中不清楚。我确实有可能更改集成服务,即使它不是我“拥有”的。据我所知,最好更改集成服务,而仅将触发器用于审计/历史记录服务。
Benny Skogberg

3

触发器是一个功能强大的工具,与其他任何工具一样,您在使用它们时需要格外小心。

  1. 当您在触发器中犯错时,事情可能会彻底出错,除非您正在运行跟踪,否则您将不会意识到...

  2. 他们“神奇地”更改/插入/删除了数据库用户(当前应用程序/任何将来的应用程序/进行一次性更新的开发人员)未实现/意图的数据。

最大的问题是,在创建触发器之后,对于其他开发人员/用户来说,甚至触发器及其作用并不明显。

也就是说,它们是维护数据完整性和真正审核更改的绝佳工具。

您需要问问自己,要放入触发器中的逻辑是否最适合应用程序或数据库内部,权衡了双方的风险(如果出现新的应用程序并且不执行此操作,会发生什么情况)规则?)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.