另一种方式是触发

时间:2010-01-26 15:19:20

标签: sql sql-server-2008

如何使用存储过程或其他任何方式获取自动操作的类型(类似于触发器完成的操作), 因为我需要当我(插入或更新或删除)tableA中的记录,或者我需要的tableB 在表C中执行相同的操作,

我不想使用触发因为一些缺点,例如:

  • 很容易在数据库中查看表关系,约束,索引,存储过程,但很难查看触发器。
  • 触发器对客户端应用程序应用程序执行不可见。它们不可见或可以在调试代码中跟踪。
  • 很难遵循他们的逻辑,因为它们可以在数据库插入/更新发生之前或之后被触发。
  • 很容易忘记触发器,如果​​没有文档,就很难找出新开发人员的存在。
  • 每次更新数据库字段时都会触发触发器,这是系统上的开销。它使系统运行更慢

所以,我只是想......是否可以通过触发器得到类似的结果? 感谢

4 个答案:

答案 0 :(得分:4)

不是直接回答你的问题,而是解决你提到的一些问题:

  

查看表关系很容易   ,约束,索引,存储   数据库中的过程但触发器是   很难看。

触发器与存储过程一样容易查看。

  

触发器执行不可见   客户端应用程序。他们   不可见或可以追溯到   调试代码。

真。但在许多情况下,同样进入存储过程并非易事。

  

很难遵循它们的逻辑   他们可以在之前或之后被解雇   数据库插入/更新发生。

不真实的。触发器在被定义为触发时,在之前或之后触发。

  

很容易忘记触发器   如果没有文件的话   很难理解   他们存在的新开发者。

如果您使用版本控制,则不真实。

  

每次触发时都会触发   数据库字段已更新,它是   系统开销。它制造系统   慢一点

写得不好的触发器与编写糟糕的代码一样可能表现不佳。 (但我并不主张过度使用。例如,如果某个动作可以通过约束来满足,则将其用于触发器。)

所有这一切,触发器仍然是一个不错的选择。如果你真的必须在应用程序层中这样做,那就去那里。

答案 1 :(得分:0)

如果确保插入tableA或tableB的所有代码都通过一个公共代码路径,那么你就可以同时插入tableC。

例如,您可以实现一个存储过程,为了将记录插入tableA,所有内容都必须调用 - 作为此sproc的一部分,您只需要包含要插入tableC的操作。

这要求所有代码都经过这个共同点。如果没有,你必须确保无论何时在tableA中完成插入,它都会重复到tableC中。这个可以做更多工作。

这就是为什么触发器很方便,因为它使它自动化。而且您不必确保所有代码路径都执行适当的调用(这在现有/遗留代码库中可能非常棘手)

答案 2 :(得分:0)

您需要撤消用户DMLA的{​​{1}}权限,并仅授予执行存储过程的权限,该存储过程将处理B的插入。

答案 3 :(得分:0)

感谢所有人的快速回复,,,

我明白使用触发器是一个很好的选择,但我在想,如果:

我在tableC中创建了一个函数(插入/更新/删除),并且可以从任何存储过程调用此函数(插入/更新/删除)tableA和tableB。如果需要更改而不是修改每个存储过程中的代码,这将允许我管理一个函数。此外,我可以在每个存储过程中使用事务来保持所有表中的数据一致。