题
我有一个 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行,您需要考虑触发器的代码一次以立即处理所有行。
触发器是一种强大的工具,就像其他任何工具一样,您在使用它们时需要小心。
当您在触发器上犯错时,事情可能会大大错误,除非您正在运行轨迹,否则您不会意识到...
他们确实“神奇”更改/插入/删除数据库用户(当前应用程序/任何未来应用程序/开发人员执行一个OFF更新)都没有意识到/打算。
最大的问题是,在您创建了触发器之后,对于其他开发人员/用户来说,触发器甚至在那里以及它的作用并不明显。
也就是说,它们是维持数据完整性和对更改进行真实审核的绝佳工具。
您需要问自己,您想在应用程序中还是在DB内置于触发器中的逻辑,并权衡双方的风险(如果新申请出现并且不强制执行此功能,会发生什么规则?)