關於觸發器要弄清楚的問題(著重後觸發器)

2021-05-23 16:02:05 字數 1359 閱讀 4103

1.觸發器的分類。

2.觸發器與事務的關係。在sql中,你可通過begin tran...commit tran 來顯示地規定乙個事務。但實際上,sql在處理updatet、delete或者insert語句時,都把這些語句當作「隱性事務」來對待。而觸發器的語句是被封裝在隱性事務裡的。所以,你可以在觸發器中使用rollback回滾事務,而不必擔心沒有begin tran來與之對應;當觸發器執行失敗時,相應的update、delete、insert也會失敗。

3.觸發器究竟觸發多少次?當一條sql語句只影響一條資料時,很明顯,觸發器會被觸發一次。但是要記住:當一條sql語句一行資料也影響不了時,觸發器也會被觸發一次;當一條sql語句同時影響多行時,觸發器還是只能被觸發一次(比如update語句一下更新多行的情況)!當然,你可以通過迴圈來一條一條insert或者update或delete,以保證每影響一條資料後,相應的觸發器一定會觸發一次。

4.你可以在觸發器的最初通過讀取@@rowcount這個全域性變數來判斷觸發器後面的語句是否要繼續執行;而當@@rowcount的值大於1時,你可以在觸發器中寫游標以便觸發器能正確地處理您的資料。

5.當後觸發器觸發後,未執行完觸發器中的所有語句時,讀觸發器所在表的資料時是「髒讀」。

6.當通過觸發器來向觸發器所來表插入、修改或者刪除資料時,不用擔心觸發器會被遞迴觸發。比如,有一表a上有一insert觸發器,在觸發器中有一 insert into a(...) values (...)語句,當執行觸發器中的insert語句時,觸發器不會再被觸發。當然,你可以更改資料庫選項recursive triggers 為true來啟用觸發器的遞迴,並且也永遠不會造成死迴圈,因為觸發器最多只能被遞迴32次,超過這個次數,當最後一次觸發器執行失敗時,會回滾到最初導致觸發器被觸發起的所有修改資料。

7.當你確實需要觸發器級聯或者遞迴時,請精心構造你的觸發器,以保證觸發器能正確的終止。

8.當乙個表中有多個後觸發器時,並且如果你對後觸發器的觸發順序有要求,你可以通過系統自帶的過程「sp_settriggerorder」來指定 「第乙個刪除觸發器」「最後乙個刪除觸發器」「第乙個更新觸發器」「最後乙個更新觸發器」「第乙個插入觸發器」「最後乙個插入觸發器」。比如說,乙個表中有4個insert觸發器,你可以指定哪個insert觸發器最先觸發和哪個insert觸發器最後觸發,而剩下的兩個insert觸發器的處罰順序就只能隨機了。(注意:替代型觸發器是不能指定觸發順序的)

9.你可以通過alter table 語句的disable trigger子句來禁用觸發器,從而使觸發器暫時失效,直到您重新啟用觸發器。

10.有兩個特殊的表:inserted和deleted。這個兩個表分別儲存資料的前映像和後映像。你可以通過讀取inserted表中的資料來知道即將向表中插入什麼資料;通過讀取deleted表中的資料來知道即將可能要刪除什麼資料。

學習新技術之前要弄清楚下面的幾個問題

目錄 1.為什麼要學習它?2.學習流程 路線。3.學習方法 4.學習資料的收集 5.學習的方法和效率 學習一門新技術之前弄清楚幾個問題 也就是學習的目的是什麼,為了幹什麼才去學習它的?知道學了之後有什麼用,會給自己帶來什麼幫助,這樣學起來才會更有動力。弄清楚學習這個新技術的框架,盡可能避免在學習中期...

專案開發和管理需要弄清楚的6個問題

1.專案需求清楚嗎 2.源 管理清楚嗎 3.專案的bug清楚嗎 4.專案跟蹤清楚嗎 5.每個成員的任務清楚嗎 6.溝通清楚嗎 總結 需求的部署環境 這個很重要,弄清楚客戶的部署環境,才能很好地開發。需求的里程碑 一般分為幾個里程碑,比如一期,二期等,或者幾個關鍵流程的某個流程走通。對需求進行分類 重...

關於深拷貝與淺拷貝的理解,終於弄清楚了

深拷貝實際上是在記憶體中開闢一塊新的位址來存放複製的物件 淺拷貝實際上是 只拷貝一層 更深層物件級別只拷貝位址 僅僅是指向被拷貝的記憶體位址,如果原位址中的物件改變了,那麼淺拷貝出來的物件也會做相應的改變。深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體 下面詳細講一下 淺拷貝 有圖...