上面介紹了有關觸發器的概念、作用和一些基本問題,下面我們將分別介紹在MS SQLServer 中如何用SQL Server 管理工具Enterprise Manager 和Transaction_SQL 來創建觸發器。
在創建觸發器以前必須考慮到以下幾個方面:
CREATE TRIGGER 語句必須是批處理的第一個語句; 表的所有者具有創建觸發器的缺省權限,表的所有者不能把該權限傳給其它用戶; 觸發器是數據庫對象,所以其命名必須符合命名規則; 盡管在觸發器的SQL 語句中可以參照其它數據庫中的對象,但是,觸發器只能創建在當前數據庫中; 雖然觸發器可以參照視圖或臨時表,但不能在視圖或臨時表上創建觸發器,而只能在基表或在創建視圖的表上創建觸發器; 一個觸發器只能對應一個表,這是由觸發器的機制決定的; 盡管TRUNCATE TABLE 語句如同沒有WHERE 從句的DELETE 語句,但是由於TRUNCATE TABLE 語句沒有被記入日志,所以該語句不能觸發DELETE 型觸發器; WRITETEXT 語句不能觸發INSERT 或UPDATE 型的觸發器。當創建一個觸發器時,必須指定觸發器的名字,在哪一個表上定義觸發器,激活觸發 器的修改語句,如INSERT、 DELETE、 UPDATE。 當然兩個或三個不同的修改語句也可 以都觸發同一個觸發器,如INSERT 和UPDATE 語句都能激活同一個觸發器。
12.6.1 用管理工具Enterprise Manger 創建觸發器
其操作步驟如下:
啟動Enterprise Manger, 登錄到指定的服務器上。 展開數據庫,然後展開要在其上創建觸發器的表所在的數據庫,然後單擊該表。 右擊鼠標,在彈出菜單中選擇ALL Tasks, 然後單擊Manage Triggers…。 在名字框中選擇new, 在文本框中輸入觸發器文本,如圖12-5 所示。 單擊Check Syntax 檢查語句是否正確。 單擊Apply, 在Name 下拉列表中會有新創建的觸發器名字。 單擊OK, 關閉窗口創建成功。
12.6.2 用CREATE TRIGGER 命令創建觸發器
各參數的說明如下:
trigger_name是用戶要創建的觸發器的名字觸發器的名字,必須符合MS SQL Server 的命名規則,且其名字在當前數據庫中必須是惟一的。 Table
是與用戶創建的觸發器相關聯的表的名字,並且該表已經存在。 WITH ENCRYPTION
表示對包含有CREATE TRIGGER 文本的syscomments 表進行加密。 AFTER
表示只有在執行了指定的操作(INSERT、 DELETE、 UPDATE)之後觸發器才被激活,執行觸發器中的SQL 語句。若使用關鍵字FOR, 則表示為AFTER 觸發器,且該類型觸發器僅能在表上創建。 INSTEAD OF
請參看“12.8 INSTEAD OF 觸發器” [DELETE] [,] [INSERT] [,] [UPDATE]
關鍵字用來指明哪種數據操作將激活觸發器。至少要指明一個選項,在觸發器的定義中三者的順序不受限制,且各選項要用逗號隔開。 WITH APPEND
表明增加另外一個已存在某一類型觸發器。只有在兼容性水平(指某一數據庫行為與以前版本的MS SQL Server 兼容程度)不大於65 時才使用該選項。 NOT FOR REPLICATION
表明當復制處理修改與觸發器相關聯的表時,觸發器不能被執行。 AS
是觸發器將要執行的動作。 Sql_statement
是包含在觸發器中的條件語句或處理語句。觸發器的條件語句定義了另外的標准來決定將被執行的INSERT、 DELETE、 UPDATE 語句是否激活觸發器。 IF UPDATE (column)
用來測定對某一確定列是插入操作還是更新操作,但不與刪除操作用在一起。 IF (COLUMNS_UPDATED())
僅在INSERT 和UPDATE 類型的觸發器中使用,用其來檢查所涉及的列是被更新還是被插入。 Bitwise_operatorj
是在比較中使用的位邏輯運算符。 Pdated_bitmask
是那些被更新或插入的列的整形位掩碼。例如,如果表T 包括C1, C2, C3, C4, C5五列。為了確定是否只有C2 列被修改,可用2 來做位掩碼,如果想確定是否C1, C2, C3,C4 都被修改,可用14 來做位掩碼。 Comparison_operator
是一比較操作符用“= ”表示檢查在updated_bitmask 中定義的所有列是否都被更新,用“>” 表示檢查是否在updated_bitmask 中定義的某些列被更新。 Column_bitmask
指那些被檢查是否被更新的列的位掩碼。