2008-11-21 108 views
3

什么是普遍的共识?观察员与触发器

如果您需要在给定操作后更改数据库,是否使用观察者模式并让框架/应用程序为您处理更新?或者你绕过应用程序并将更新委托给数据库触发器?

显然触发更快,但它值得吗?

+0

说出你在答案中使用的框架可能很有意思。 – ewakened 2008-11-21 00:58:58

回答

3

我使用触发器,但触发器通常是特定于数据库的。如果你打算支持多个数据库服务器,当然可以找到一种方法来代码。如果您确定您将使用特定的数据库服务器,那么您的数据完整性将会爱上您的触发器。

+2

触发器需要非常非常少用。当一个INSERT可能导致数十个触发器和数百行代码级联时,这是一个难以维护的危险情况。你决定不使用触发器的地方越多,你就越好。 把它放在crud包 – 2008-11-21 05:24:15

3

因为我们使用LINQ2SQL这个任务很容易被创建覆盖SubmitChanges()方法。我们的主要目标是在我们的表格中进行审计。该代码将是这样的:

/// <summary> 
    /// Sends changes that were made to retrieved objects to the underlying database, 
    /// and specifies the action to be taken if the submission fails. 
    /// NOTE: Handling this event to easily perform Audit tasks whenever a table gets updated. 
    /// </summary> 
    /// <param name="failureMode">The action to be taken if the submission fails. 
    /// Valid arguments are as follows:<see cref="F:System.Data.Linq.ConflictMode.FailOnFirstConflict"/> 
    /// <see cref="F:System.Data.Linq.ConflictMode.ContinueOnConflict"/></param> 
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode) 
    { 
     //Updates 
     for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++) 
     { 
      object modifiedEntity = this.GetChangeSet().Updates[changeCounter]; 
      SetAuditStamp(this, modifiedEntity, ChangeType.Update); 
     } 

     //Inserts 
     for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++) 
     { 
      object modifiedEntity = this.GetChangeSet().Inserts[changeCounter]; 
      SetAuditStamp(this, modifiedEntity, ChangeType.Insert); 
     } 
     base.SubmitChanges(failureMode); 

我们格外不喜欢使用触发器,因为他们总是隐藏到您DB和它使硬制定出可能出现的问题......与具有进入你的代码只需要开始调试它找出为什么有些事情失败了,例如...

+1

一致认为触发因所提及的原因而发臭。完全不同意审计最好在数据库之外完成。如果您极其严格地执行访问请求,那么任何人都无法获得用户名/密码到您的数据库,那么您有可能有战斗机会。 – 2008-11-21 05:21:41

2

除非您支持多个DBMS,否则您的框架在未来5年(比如说)比您选择的DBMS更有可能发生变化。此外,未来可能有一些要求支持其他形式的输入,例如,网页或移动设备。将这些操作放入数据库触发器中意味着无论触发它们的应用程序如何,都会执行这些操作。