2008-11-21 144 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更有可能發生變化。此外,未來可能有一些要求支持其他形式的輸入,例如,網頁或移動設備。將這些操作放入數據庫觸發器中意味着無論觸發它們的應用程序如何,都會執行這些操作。