我有一个 Object 由集成服务填充的表(如果需要我可以更改)来自另一个数据库。在某些时候,我们需要手动在另一个表中添加帖子 ObjectObjectGroup (ObjectId, ObjectGroupId) 如果需要的话 Object.ObjectType 具有一定的整数值。由于集成服务不处理此类更新,因此我正在考虑向对象表添加一个触发器,其伪代码如下:

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

这种设置是否明智,或者在性能方面有更好的方法吗?

有帮助吗?

解决方案

主要是复制/粘贴我的回复 问题 在堆栈溢出上

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

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

  • 跟踪“date_created”和“date_last_edited”字段
  • 插入“ID”(在 oracle 中,没有自动 id 字段)
  • 保留变更历史记录

您不想使用触发器的事情

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

其他提示

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

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

触发器是一种强大的工具,就像其他任何工具一样,您在使用它们时需要小心。

  1. 当您在触发器上犯错时,事情可能会大大错误,除非您正在运行轨迹,否则您不会意识到...

  2. 他们确实“神奇”更改/插入/删除数据库用户(当前应用程序/任何未来应用程序/开发人员执行一个OFF更新)都没有意识到/打算。

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

也就是说,它们是维持数据完整性和对更改进行真实审核的绝佳工具。

您需要问自己,您想在应用程序中还是在DB内置于触发器中的逻辑,并权衡双方的风险(如果新申请出现并且不强制执行此功能,会发生什么规则?)

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top