我想創建插入新行的SQL觸發器,當且僅當它通過給定條件時。我可以想到一些方法來做到這一點,但我不確定哪種方法是最好的或正確的。使用觸發器有條件地插入的最佳方式
- 執行AFTER INSERT觸發器,然後在條件失敗時刪除新行。
- 做一個BEFORE INSERT觸發器,如果失敗則引發應用程序錯誤。
- ???
我想創建插入新行的SQL觸發器,當且僅當它通過給定條件時。我可以想到一些方法來做到這一點,但我不確定哪種方法是最好的或正確的。使用觸發器有條件地插入的最佳方式
選項1創建競爭條件。我會明確避免這一點。
選項2可能會導致顯着較慢INSERT
s,但可以工作。
選項3是一個存儲過程,但您可能需要爲插入的每一行調用proc,除非正確設置安全性,否則實際上可能不會阻止用戶直接插入數據。
選項4是將所有內容插入登臺表或事務表中,然後使用具有查詢或視圖的代理或過程將有效數據移動到活動表。這是一個非常古老的學校,因爲你不再像現代的RDBMS那樣使用RDBMS,所以它是相當討厭的。預計關鍵違規問題和同步存在很多問題。而且您也有與選項3相同的安全問題。此方法通常僅用於批量導入和導出。
選項5是驗證應用程序中的數據而不是數據庫。這會起作用,但當客戶嘗試像RDBMS一樣使用RDBMS時會遇到問題。然後,您遇到與選項3相同的安全問題。它不會實際解決問題或防止應用程序之外的程序存儲無效數據。
選項6將使用支持CHECK
約束的RDBMS,該約束幾乎不包括MySQL或MariaDB的所有內容。 MS SQL Server,Oracle,DB2,PostgreSQL,甚至MS Access和SQLite都支持CHECK
約束。 MySQL沒有那麼適度地荒謬。
在執行插入操作之前,是否可以更好地使用存儲過程來檢查傳入數據? – OneHoopyFrood 2014-10-27 19:49:24
我不認爲這種情況會有什麼不同。 – 2014-10-27 19:53:11