tft每日頭條

 > 圖文

 > after觸發器有幾種

after觸發器有幾種

圖文 更新时间:2024-06-28 09:18:35
概述

最近在寫觸發器時碰到一個報錯,簡單記錄如下:報錯信息:

> [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]不能在 'inserted' 表和 'deleted' 表中使用 text、ntext 或 image 列。 (311)

after觸發器有幾種(一文看懂INSTEADOF與AFTER)1

下面記錄下解決的思路和方法,僅供參考。


思路

不能比較或排序 text、ntext 和 image 數據類型,這裡除非使用 IS NULL 或 LIKE 運算符,這裡改成 instead of 就可以在觸發器中訪問二進制字段了,也不需要去根據id去查

所以這裡隻需要把其中的“AFTER” 改成 “instead of” 就可以了。

調整後:

after觸發器有幾種(一文看懂INSTEADOF與AFTER)2


那麼AFTER和instead of有什麼區别呢?

1、INSTEAD OF 觸發器

INSTEAD OF 觸發器用來代替通常的觸發動作,即當對表進行INSERT、UPDATE 或 DELETE 操作時,系統不是直接對表執行這些操作,而是把操作内容交給觸發器,讓觸發器檢查所進行的操作是否正确。如正确才進行相應的操作。因此,INSTEAD OF 觸發器的動作要早于表的約束處理。

INSTEAD OF 觸發器的操作有點類似于完整性約束。在對數據庫的操縱時,有些情況下使用約束可以達到更好的效果,而如果采用觸發器,則能定義比完整性約束更加複雜的約束。

INSTEAD OF 觸發器不僅可在表上定義,還可在帶有一個或多個基表的視圖上定義,但在作為級聯引用完整性約束目标的表上限制應用。

2、AFTER 觸發器

AFTER 觸發器定義了對表執行了 INSERT、UPDATE 或 DELETE 語句操作之後再執行的操作。比如對某個表中的數據進行了更新操作後,要求立即對相關的表進行指定的操作,這時就可以采用 AFTER 觸發器。AFTER 觸發器隻能在表上指定,且動作晚于約束處理。

每一個表上隻能創建一個 INSTEAD OF 觸發器,但可以創建多個 AFTER 觸發器。

after觸發器有幾種(一文看懂INSTEADOF與AFTER)3

3、實例:

INSTEAD OF 觸發器:

向表“計0261”插入數據時,檢查學号是否存在于表“計026”中,如存在則進行插入操作,否則就不插入。

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 觸發器,用來在插入記錄時自動将統計值計算到訂貨統計表中。

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


覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注下~

after觸發器有幾種(一文看懂INSTEADOF與AFTER)4

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved