INSTEAD OF 觸發器

 INSTEAD OF 觸發器用來代替通常的觸發動作,即當對錶進行INSERT、UPDATE 或 DELETE 操作時,系統不是直接對錶執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,INSTEAD OF 觸發器的動作要早於表的約束處理。
INSTEAD OF 觸發器的操作有點類似於完整性約束。在對數據庫的操縱時,有些情況下使用約束可以達到更好的效果,而如果採用觸發器,則能定義比完整性約束更加複雜的約束。有關觸發器與約束的比較,請參見聯機叢書。
INSTEAD OF 觸發器不僅可在表上定義,還可在帶有一個或多個基表的視圖上定義,但在作爲級聯引用完整性約束目標的表上限制應用。
AFTER 觸發器定義了對錶執行了 INSERT、UPDATE 或 DELETE 語句操作之後再執行的操作。比如對某個表中的數據進行了更新操作後,要求立即對相關的表進行指定的操作,這時就可以採用 AFTER 觸發器。AFTER 觸發器只能在表上指定,且動作晚於約束處理。
每一個表上只能創建一個 INSTEAD OF 觸發器,但可以創建多個 AFTER 觸發器。
實例:
INSTEAD OF 觸發器:
向表“計0261”插入數據時,檢查學號是否存在於表“計026”中,如存在則進行插入操作,否則就不插入。

SQL code
CREATE TRIGGER [checkid] ON [dbo].[計0261] 
INSTEAD OF insert
AS
IF NOT EXISTS(SELECT * FROM 計026 WHERE 學號=(SELECT 學號 FROM INSERTED))
  BEGIN
    ROLLBACK TRANSACTION
    PRINT '要處理記錄的學號不存在!'
  END
ELSE
  BEGIN
    INSERT INTO 計0261 select * from inserted
    PRINT '已經成功處理記錄!'
  END


AFTER 觸發器:
對訂貨表設置 AFTER(FOR) 類型的 INSERT 觸發器,用來在插入記錄時自動將統計值計算到訂貨統計表中。

SQL code
CREATE TRIGGER [orderinsert] ON [dbo].[訂貨表]
AFTER INSERT
AS
DECLARE @bookid int, @ordernum int, @num int
SELECT @bookid = 書籍編號, @ordernum = 數量 FROM INSERTED
SELECT @num = count(書籍編號) FROM 訂貨統計表 WHERE 書籍編號=@bookid
IF @num = 0
  --未找到該書,插入記錄
  INSERT INTO 訂貨統計表 VALUES(@bookid, @ordernum)
ELSE
  --找到該書,更新記錄
  UPDATE 訂貨統計表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章