問候語, 最近,我開始在一個應用程序上工作,其中8個不同的模塊在工作流程的某個點使用同一個表。該表具有5,000行的Replace-Of觸發器(前500和後500行對於所有模塊都是通用的,然後每個模塊都有自己的500行代碼)。 由於模塊的數量將會增長,我希望儘可能使事物保持清晰(並且單獨),所以我想知道是否有將觸發器拆分爲存儲過程的某種最佳實踐,或者我應該把它全部放在一個地點? P.S.從觸發器調用過程並將15+個參數傳遞給它們會有什麼性能損失?SQL Server中的分割觸發器
回答
銘記的inserted
and deleted
僞表是從觸發代碼中唯一的訪問,並且它們可以包含多行,你面臨兩個選擇:
過程中的行
inserted
和deleted
在RBAR 時尚,能夠標量參數傳遞到存儲過程,或將來自
inserted
和deleted
的所有數據複製到表變量中,然後根據需要將它們傳遞給過程。
我預計這兩種方法強加一些性能開銷,剛剛從複製
話雖這麼說,這聽起來像太多正在發生內部觸發自己 - 做這一切代碼必須是執行DML語句的同一事務的一部分?如果沒有,請考慮使用某種形式的隊列(例如請求或服務代理表)來放置要執行的工作信息,然後再處理數據 - 如果使用Service Broker,則可以讓它檢查共享消息,然後根據需要向您的每個模塊的專用端點發送適當的消息。
連續被折騰行 - 無論是使用別的東西來模擬一個依次訪問各行cursor
- 當在基於集合的語言,如SQL通常皺起了眉頭。
如果不深入瞭解代碼的具體細節並嘗試所有可能的方法並測量結果,多少是不可能知道的。
對不起,延遲迴復,並感謝您的回答! 關於RBAR:首先,我試圖避免遊標,因爲我聽說這是一種不好的做法。其次,我試圖避免對該表進行批量更新,並允許一次只處理一行(因此不需要任何其他技術)。 關於你的Q:不,每個模塊都使用自己的部分代碼。我正在使用GOTO進入和離開部分。 我已經找到解決方案將觸發器分成多個過程,儘管如果發生某些重大更改將會更難以維護。只是在不同的標籤中打開所有的程序是一件痛苦的事情。乾杯:) – CubicsRube
我不認爲在這種情況下會有一個有意義的性能損失。
無論如何,把它全部寫入觸發器(當它是5000行長......)是不好的做法。 我認爲主要考慮的是可維護性,這將是更好,如果你把它分解 爲若干SPS
- 1. SQL Server:觸發器觸發
- 2. SQL Server觸發器
- 3. Sql Server觸發器
- 4. Sql Server觸發器
- 5. SQL Server觸發器
- 6. SQL Server中,INSERT觸發器
- 7. SQL Server 2005 - 觸發器沒有觸發
- 8. SQL Server:分割CSV
- 9. SQL Server中的觸發器的替代
- 10. SQL Server:原子觸發器
- 11. SQL Server:插入觸發器
- 12. SQL Server 2008觸發器
- 13. SQL Server FOR/AFTER觸發器
- 14. SQL Server觸發器更新
- 15. SQL Server 2012觸發器
- 16. Sql Server 2008觸發器
- 17. SQL Server行級觸發器
- 18. 更新觸發器SQL Server
- 19. 觸發器在SQL Server
- 20. 觸發器,SQL SERVER 2008
- 21. 觸發器在SQL Server 2005
- 22. 觸發器 - 與SQL Server
- 23. PROBLEMA SQL SERVER ROLLBACK觸發器
- 24. 觸發器處理SQL Server
- 25. 觸發器在SQL Server
- 26. breeze和sql server觸發器
- 27. SQL Server 2005 SQLAgent觸發器
- 28. SQL Server 2000觸發器
- 29. sql server觸發器插入
- 30. SQL Server 2005中觸發器的問題
什麼是SQL Server中的「模塊」?你的意思是不同的數據庫對象或東西? –
我對此感到抱歉。我將'module'稱爲'application module',它由數據庫對象,業務邏輯等組成。假設它是一個管理系統,其中8個不同的應用程序引用一個表。 – CubicsRube