觸發器摘錄

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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 定貨統計表
SET 總定貨量 = 總定貨量 + @ordernum WHERE 書籍編號 = @bookid
地址:http://bbs.csdn.net/topics/300074591
相關文章
相關標籤/搜索