工作原理:
after
--執行sql之後觸發觸發器
before(instead of)
--執行sql之前觸發觸發器
after觸發器的工作原理:
after觸發器是在sql語句執行之後才被啟用的。以刪除記錄為例:當sql server接收到一條刪除操作的sql語句時,sql server先將要刪除的記錄存放在deleted表裡,然後把資料表裡的記錄刪除,再啟用after觸發器,執行after觸發器裡的sql語句。執行完畢之後, 刪除記憶體中的deleted表,操作結束。
還是舉上面的例子:在產品庫存表裡,如果要刪除一條產品記錄,在刪除的時候,觸發器可以檢查該產品庫存數量是否為零,如果不為零則取消刪除操作。資料庫的操作如下:
1,接收sql語句,將要從產品庫存表裡刪除的產品記錄取出來,放在刪除表裡。
2,從產品庫存表裡刪除該產品記錄。
3,從刪除表裡讀出該產品的庫存數量字段,判斷是不是為零,如果為零的話,完成操作,從記憶體裡清除刪除表;如果不為零的話,用rollback transaction語句來回滾操作(即將庫存表還原成刪除之前的狀態)。
instead of 觸發器的工作原理:
instead of觸發器與after觸發器不同。after觸發器是在insert、update和delete操作完成後才啟用的,而instead of觸發器,是在這些操作進行之前就啟用了,並且不再去執行原來的sql操作,而是用觸發器本身的sql語句代替原來的語句去執行。
還拿上面那個例子來說,刪除一條產品記錄的時候,用instead of將刪除操作替換成查詢該產品的庫存。資料庫的操作如下:
1,接收sql語句,但不執行,而是跳轉到instead of後面的sql語句
2,根據傳入的產品id,將該產品的庫訪問出,完成操作。
說了那麼多理論上的東西,下面讓我們看看觸發器的**到底怎麼寫:
下面的一段**是觸發器的乙個框架。
create trigger trigger_name --觸發器名,在乙個資料庫中觸發器名是唯一的。
on table_name | view_name --觸發器所在的表或者檢視。
after(for)|instead of insert,delete,update --定義成after或instead of型別的觸發器。
--after跟for相同,不可在檢視上定義after觸發器
-- 後面是觸發器被觸發的條件,最少有乙個,可以郵多個。如果有多個用逗號分開,順序無要求。
as --觸發器要執行的操作
begin
--begin跟end組成乙個**塊,可以寫也可以不寫,如果觸發器中執行的sql語句比較複雜,用begin和end會讓**更加整齊,更容易理解。
endgo --go就代表結操作完畢
注意事項:
1,after觸發器只能用於資料表不能用於檢視;instead of觸發器兩者皆可,設定為with check option的檢視也不允許建立instead of觸發器。兩種觸發器都不可以建立在臨時表上。
2,乙個資料表可以有多個觸發器,但是乙個觸發器只能對應乙個表。
3,在同乙個資料表中,對每個操作(如insert、update、delete)而言可以建立許多個after觸發器,而instead of觸發器針對每個操作只有建立乙個。
4,如果針對某個操作即設定了after觸發器又設定了instead of觸發器,那麼instead of觸發器一定會啟用,而after觸發器就不一定會啟用。
5,不同的sql語句,可以觸發同乙個觸發器,如insert和update語句都可以啟用同乙個觸發器。
6,觸發器名在所在的資料庫裡必須是唯一的。由於觸發器是建立中資料表或檢視中的,所以有很多人都以為只要是在不同的資料表中,觸發器的名稱就可以相同,其實觸發器的全名(server.database.owner.triggername)是必須 唯一的,這與觸發器在哪個資料表或檢視無關。
7,關鍵字after可以用for來代取,它們的意思都是一樣的,代表只有在資料表的操作都已正確完成後才會啟用的觸發器。
觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...
觸發器及觸發器的作用
觸發器是一種用來保障參照完整性的特殊的儲存過程,它維護不同表中資料間關係的有關規則。當對指定的表進行某種特定操作 如 insert,delete或update 時,觸發器產生作用。觸發器可以呼叫儲存過程。建立觸發器的語法 create trigger owner.觸發器名 on owner.表名 f...
觸發器(五 復合觸發器)
oracle11g開始提供了一種復合觸發器,簡單的說就是支援把語句級和行級觸發器組合在一起。實際應用場景不多,這裡就做個記錄。與單個觸發器語法有所區別 1.單個觸發器的頭部是 before after 動作 on 物件 for 觸發級別 而組合觸發器的頭部是 for 動作 on 物件 compoun...