Sql 觸發器
觸發器是一種特殊的存儲過程﹐它不能被顯式地調用﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。所以觸發器可以用來實現對表實施複雜的完整性約束。
觸發器在數據庫裏以獨立的對象存儲,與存儲過程不同的是,存儲過程通過其他程序來啟動運行,而觸發器是由一個事件來啟動運行。即當某個事件發生時,觸發器自動地隱式運行。並且,觸發器不能接收參數。
觸發器對象定義了觸發器的特征和被調用時采取的行動。而這些動作是通過一個或多個SQL語句來實現的。SQL支持3種類型的觸發器:INSERT(插入)、UPDATE(更新)和DELETE(刪除)。當向表中插入數據、更新數據或刪除數據時,觸發器就被調用。通過給表定義一個或多個觸發器,可以指定哪個數據修改時,可以激發觸發器。
一、SQL Server
SQL Server為每個觸發器都創建了兩個專用表:Inserted表和Deleted表。這兩個表由係統來維護﹐它們存在於內存中而不是在數據庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同。 觸發器執行完成後﹐與該觸發器相關的這兩個表也被刪除。
Deleted表存放由於執行Delete或Update語句而要從表中刪除的所有行。
Inserted表存放由於執行Insert或Update語句而要向表中插入的所有行。
在SQLServer中,可以采用CREATETRIGGER命令創建觸發器。語法如下:
CREATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{ {{FOR|AFTER|INSTEADOF}{[DELETE][,][INSERT][,][UPDATE]} [NOTFORREPLICATION] AS [{IFUPDATE(column) [{AND|OR}UPDATE(column)] [...n] |IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask) {comparison_operator}column_bitmask[...n] }] sql_statement[...n]}}
- trigger_name:為用戶要創建的觸發器的名字,觸發器的名字必須符合SQLServer的命名規則,且其名字在當前數據庫中必須是惟一的。
- Table、view:與觸發器相關聯的表或視圖的名字,並且該表或視圖必須已經在數據庫中存在。
- WITHENCRYPTION:表示對含有CREATETRIGGER文本的syscomments表進行加密,防止用戶通過查詢syscomments表獲取觸發器的代碼。
- AFTER:表示隻有執行了指定的操作(INSERT、DELETE、或UPDATE)之後,觸發器才被激活,執行觸發器中的SQL語句。
- FOR:表示為AFTER觸發器,且該觸發器僅能在表上創建。
- INSTEADOF:指定觸發器為INSTEADOF觸發器
- 小注:每個表最多隻能有一個INSTEADOF(INSERT、UPDATE、DELETE)觸發器。然而可以為每個表創建多個視圖,對每個視圖都可以有不同的INSTEADOF觸發器。
- DELETE、INSERT、UPDATE:指明執行哪種操作,將激活觸發器。至少要包含3種操作類型種的一種,也可以是3種操作語句的任意組合。其中三者的順序不受限製,且各選項要用逗號隔開。
- NOTFORREPLICATION:告訴DBMS,當複製表時,觸發器不能被執行。AS:後麵列出觸發器將要執行的動作。
- IFUPDATEcolumn:用來測定對某一確定列是INSERT操作還是UPDATE操作。如果要測試INSERT還是UPDATE操作的列多於一列,可用AND或OR邏輯連接向IFUPDATE子句添加所希望的附加列名。
- IFCOLUMNS_UPDATED():僅在INSERT和UPDATE類型的觸發器中使用,檢查列是被更新還是被插入。
- bitwise_operator:代表位邏輯運算符,常用“&”。
- updated_bitmask:表示列的整位掩碼。其中最右邊的位表示表或視圖的第1列,左邊第2位代表第2列,依此類推。
- comparison_operator:表示比較操作符。可以是“=”或者“>”。“=”表示檢查在updated_bitmask中定義的所有列是否都被更新,用“>”表示檢查是否在updated_bitmask小注:
- 為了便於理解,這裏給出一個使用IFCOLUMNS_UPDATED()子句的例子。如果表T包括C1、C2、C3、C4、C5和C66列,為了檢查C2、C4或者C6列是否更新過,可使用42(二進製表示為“101010”)作為掩碼,表示為:IF(COLUMNS_UPDATED()&42)>0;如果檢查C2、C4和C63列是否都被更新過,表示為:IF(COLUMNS_UPDATED()&42)=42
-
sql_statement:代表包含在觸發器中的處理語句。
當不再需要觸發器時,可用DROPTRIGGER語句刪除觸發器。語法如下:
DROP TRIGGER trigger_name[...n]
二、Oracle
在Oracle中共有3種類型的觸發器:DML觸發器、替代觸發器和係統觸發器。
DML觸發器:Oracle可以在DML語句(INSERT、UPDATE、DELETE)進行觸發,可以在DML操作前或操作後進行觸發,並且可以對每個行或語句上進行觸發。替代觸發器(INSTEADOF):與SQLServer中的INSTEADOF觸發器類似,由於在Oracle裏,不能直接對由兩個以上的表建立的視圖進行操作。所以給出了替代觸發器。係統觸發器:從Oracle8i開始,提供了第三種類型的觸發器叫係統觸發器。它可以在Oracle的事件中進行觸發,如Oracle係統的啟動與關閉等。
在Oracle中,觸發器的創建也是通過CREATETRIGGER語句來實現的,但與SQLServer中的觸發器創建語法有較大的差別。語法如下:
CREATE TRIGGER trigger_name [BEFORE|AFTER] trigger_event ON table_reference [FOREACHROW[WHENtrigger_condition]]trigger_body說明如下:
- rigger_name:為觸發器的名字。在Oracle中,觸發器名與存儲過程名字不一樣,它是單獨的名字空間,因而觸發器名可以和表或存儲過程有相同的名字。
- BEFORE|AFTER:指明了觸發器是在數據修改前(BEFORE),還是修改後(AFTER)被調用。
- trigger_event:為觸發器事件,可以是INSERT、UPDATE或DELETE。如果要創建替代觸發器,則隻需在觸發事件前加上關鍵詞INSTEADOF即可。
- ON:子句則包含了目標表的名稱,也就是觸發器應用的表。
- FOREACHROW:指明每次插入、更新或刪除一行時就調用觸發器。
- WHEN:是可選的,可以定義搜索條件,來限製調用觸發器時的搜索範圍。
- trigger_body:為觸發器執行的SQL語句,這些語句必須被放在BEGIN……END塊中。
- 另外,在Oracle中,觸發器的應用受到一定的限製,主要的限製條件有以下幾個。觸發器中可以包括DML語句,但不能使用控製語句、COMMIT語句、ROLLBACK語句、SVAEPOINT語句。然而,對於“係統觸發器”,則可以使用CREATE語句、ALTER語句或者DROP語句。由觸發器所調用的存儲過程或函數也不能使用控製語句。觸發器中不能使用LONG、LONGRAW數據類型。
本文來自百度文庫:點擊打開鏈接
最後更新:2017-04-03 12:54:45