sql解髮器,雖然對它有一定認識,但自從我工作這近四年來,還沒有寫過解髮器,我想也有很多朋友像我一樣,雖然經常使用ado.net,但無非都是些增刪改查的操作。解髮器的應用比起儲存過程可謂要少的多,至到時最近的乙個專案需求,讓我想到了解髮器的應用場景。
往往乙個公司的it部門會根據職能或者是業務劃分,每個部門負責一部分功能模組,部門之間即獨立也有聯絡,當其它部門所做的功能不能完全滿足你的需求時,你有可能需要自己動手來協助完善其功能。
具體例子:部門a負責酒店的業務,所有酒店查詢,訂單處理都由他們完成,酒店都有統一的庫存管理,但有的酒店比較特殊,可以用積分來換,但這種酒店的庫存和正常的酒店庫存並不統一,唯一的共同點就是積分兌換的酒店**與正常酒店**存在乙個比例,例如正常酒店(北京飯店)一晚100元,那麼積分酒店(北京飯店)就需要100*100積分。原來積分兌換的酒店**都由系統錄入時手工指定**,但現在業務變更,需要在錄入積分酒店時,自動初始化**,這個**就要以對應的正常酒店**為準。
問題:初始化**如何取?
方法一:修改錄入積分酒店的程式。
優點:處理方便,在錄入資料時,先查找到對應正常酒店的**,然後一併寫入資料庫。
缺點:需要其它人支援,如果此段程式無人維護,處理難度會非常大。
方法二:給原來程式額外打乙個補丁。在資料錄入資料庫後,利用觸發器自動初始化**。
優點:只需要額外增加乙個觸發器,改動量相對小。
缺點:相對方法一的缺點就不值得一說了。
觸發器定義:它是一種型別獨特的過程,非常類似c#中的事件。asp.net中,當點選乙個按鈕,就會觸發相應事件。觸發器與資料庫表相關聯,當表中內容發生如下特殊變化時,觸發器就會被觸發。1:insert;2:update;3:delete。
說明:本文只**after觸發器,至於instead-of觸發器不在本文討論範圍之內。after觸發器的語法我也略過,重點分享下在應用觸發器時應該注意的地方。
第一:觸發器不會對每條記錄都觸發一次。例如我們在一次事務中更新或者刪除了一條以上的記錄,觸發器只會觸發一次,但能正常反映所有受影響的行。
第二:使用觸發器一定要清楚兩個虛似表:
1:inserted,事務中被插入的所有記錄。
2:deleted,事務中被刪除的所有記錄。
說明:資料庫中不存在updated表,因為資料的更新是先刪除然後插入的過程。有了上面兩個虛似表,我們就可以在受影響的行上做其它操作,例如在錄入積分酒店資料後,利用inserted中的資料資訊來更新本記錄的某些字段值。
第三:after,從字面意義來看應該是某個操作之後的意思,after觸發器就是資料成功插入資料表後執行的操作,如果插入資料失敗,對應的觸發器是不會引發的。
第四:觸發器與開發人員在對於什麼樣才是對錶的成功操作概念上有不同的定義,當更新或者是刪除0條記錄時,觸發器也會被觸發,但對於開發人員來說,顯然這種觸發是沒有意義的。此種觸發第一是沒有意義,第二是占用系統資源,如果你的資料伺服器非常繁忙,而且有使用者正在鎖定資料庫表,執行觸發器的時間往往比你想象的要多。所以我們希望遇到這種情況應該盡快退出觸發器。我們可以用如下**來完成,此**一定要在解髮器語句的開頭部分體現,否則@@rowcount會受到前面**的影響。
if @@rowcount =0
begin
'觸發器退出
'return
end
第四:不要在儲存過程中使用select以及print語句,雖然這兩個語句在除錯過程中非常好用,但最好不要體現在正式上線環境中,這些語句會產生另外的結果集,如果沒有正常處理它們,或者是沒有預料到它們的出現,那麼這種結果集有可以影響到客戶端應用程式的失敗。
第五:觸發器管理。
1:利用sp_helptrigger命令來檢視乙個表關聯的觸發器。sp_helptrigger 表名
2:利用sp_helptext命令來查詢某乙個觸發器的**。sp_helptest 觸發器名。
3:刪除觸發器,和刪除資料庫其它物件類似,drop trigger 觸發器名。
4:修改觸發器和生成觸發器內容差不多,只不過修改的語句為alter trigger。
5:利用exec sp_rename命令來完成觸發器的重新命名。
第六:觸發器中的事務管理。觸發器始終是對它進行初始化事務的一部分,這個事務可以是顯式的也可以是隱式的。可以在觸發器中使用如下指令碼來回滾之前的資料操作。在這之前的**中並不一定要顯示的寫begin transaction之類的**。
if @@error
<>
0begin
rollback transaction
end第七:觸發器的執行順序,對於after觸發器來說,乙個表可以對應多個after觸發器,眾多觸發器如何來控制它們的執行順序呢?我們可以利用exec sp_settrggerorder命令來完成,示命如下:
**exec sp_settriggerorder @triggername
=觸發器名稱,
@order='
first,或者是last或者是none',
@stmttype='
資料操作型別,例如insert,update或者是delete
'第八:哪些情況下根本不需要使用觸發器:
1:如果能夠使用約束實現的功能,就不要使用觸發器。
2:如果可以使用儲存過程來完成,那麼也不分使用觸發器。
說明:觸發器的實現,除錯,管理比起儲存過程都更加困難,如果有更好的方式實現你的需求最好不要使用觸發器,除非沒有比觸發器更簡單的方法。
總結:
出處:
觸發器總結
觸發器總結 trigger是當特定的sql dml 語句,如insert update或者delete語句在特定的資料庫表上執行時,由資料庫自動啟用的過程。觸發器對於實現表中某個列值得高階變更審計等功能非常有用。1 觸發器執行的時機 觸發器可以在sql語句執行之前和之後啟用。觸發器根據dml語句影響...
SQL觸發器總結
對於不可更新的檢視要進行更新時,可以用觸發器中的 instead of 進行更新 建立乙個插入操作的觸發器 當向學生選課表sc中插入一條記錄後,變更在學生表student對應學生的選課門數。create trigger stu in onsc 對哪個表或者檢視進行操作 forinsert 設定觸發條...
SQL Server觸發器總結
觸發器的簡介 觸發器 trigger 是sql server 提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對乙個表進行操作 insert,delete,update 時就會啟用它執行。觸發器...