2010-01-26 114 views
1

我如何獲得自動操作的類型(類似於由觸發器完成的),而不是使用存儲過程,或者任何其他方式,因爲我需要當我(插入或更新或刪除)在tableA的記錄,或tableB的我需要 做表C進行同樣的操作,另一種方式,而不是觸發

我不想使用觸發器,因爲一些缺點,如:

  • 這是很容易查看錶關係,約束,索引,數據庫中的存儲過程,但觸發器很難查看。
  • 觸發器對客戶端應用程序應用程序執行不可見。它們不可見或可以在調試代碼中進行追蹤。
  • 很難遵循它們的邏輯,因爲它可以在數據庫插入/更新發生之前或之後被觸發。
  • 很容易忘記觸發器,如果​​沒有文檔,將很難找出新開發人員的存在。
  • 觸發器每次更新數據庫字段時都會運行,並且系統開銷較大。它使系統運行更慢

所以,我只是想...是否有可能得到與觸發類似的結果? 謝謝

回答

0

如果你確保所有插入tableA或tableB的代碼都通過一個單一的通用代碼路徑,那麼你可以同時插入到tableC中。

例如,您可以實現一個存儲過程,所有內容都必須調用才能將一條記錄插入到tableA中 - 作爲此sproc的一部分,您只需包含該操作即可插入到tableC中。

這需要所有的代碼都經過這個共同點。如果沒有,那麼無論何時在tableA中完成插入操作時都必須確保無處不在,它會將其重複放入tableC中。這可以是更多的工作。

這就是爲什麼觸發器很方便,因爲它使它自動化。而你不必須確保所有代碼路徑做相應的調用(這可以在現有/遺留代碼庫非常棘手)

4

不能直接回答你的問題,但解決一些你所提到的事情:

很容易查看錶格關係 ,約束,索引,存儲 程序在數據庫中,但觸發器 難以查看。

觸發器和存儲過程一樣容易查看。

觸發器對 客戶端應用程序應用程序執行不可見。他們 不可見或可以在 調試代碼中追蹤。

是的。但在很多情況下,進入存儲過程也不是微不足道的。

很難按照他們的邏輯,因爲它 他們之前或之後 數據庫插入/更新發生被解僱。

不真實的。觸發器在它們被定義爲在觸發之前觸發,在觸發前或觸發之前。

這是很容易有關觸發器 忘記,如果沒有文件它 將很難找出爲他們的生存 新的開發。

不真實的,如果你正在使用的版本控制。

觸發器每次運行時 數據庫字段更新,這是 頭頂上的系統。它使得系統 運行速度較慢

寫得不好的觸發器與寫入不良的代碼一樣可能執行得不好。 (但我不主張他們的過度使用。例如,如果一個動作都能得到滿意的約束,使用它在觸發。)

所以所有的說,觸發仍然是一個不錯的選擇。如果您確實必須在應用程序層中執行此操作,請在此處執行此操作。

+0

謝謝您指出,開發人員在處理觸發器方面的無能並不是避免它們的正當理由。 – HLGEM 2010-01-26 21:12:46

0

你需要從用戶的AB撤銷DML權限,只授予權限執行存儲過程這將處理插入到C

0

感謝所有的及時答覆,,,

據我所知,使用觸發器是一個不錯的選擇一些點,但我在想,要是:

我要創造(插入/更新功能/刪除),並且可以從任何存儲過程(將插入/更新/刪除)調用該函數tableA和tableB。這將允許我管理一個函數,如果需要更改而不是修改每個存儲過程中的代碼。另外,我可以在每個存儲過程中使用事務來保持所有表中的數據一致。

+0

什麼保證沒有人會直接通過腳本進行更改並使用sps或函數?假設你必須改變一百萬個reciords,你不會一次循環一個記錄嗎?不,當然不。觸發器是最好的解決方案。 – HLGEM 2010-01-26 21:12:06

相關問題