共計 2563 個字符,預(yù)計需要花費 7 分鐘才能閱讀完成。
sqlserver 中怎么實現(xiàn)觸發(fā)器,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
總結(jié)常用基本點如下:
1、觸發(fā)器有兩種類型:數(shù)據(jù)定義語言觸發(fā)器(DDL 觸發(fā)器)和數(shù)據(jù)操縱語言觸發(fā)器(DML 觸發(fā)器)。DDL 觸發(fā)器:在用戶對數(shù)據(jù)庫執(zhí)行數(shù)據(jù)定義(CREATE、ALTER、DROP 或相似的語句)對數(shù)據(jù)庫結(jié)構(gòu)進(jìn)行修改時激活而做出響應(yīng)。DML 觸發(fā)器:在用戶對數(shù)據(jù)庫執(zhí)行數(shù)據(jù)操作時發(fā)生,觸發(fā)器中的代碼會被自動調(diào)用。
2、DML 觸發(fā)器分類:Insert 觸發(fā)器、Delete 觸發(fā)器、Update 觸發(fā)器、上面任意類型混合。
3、觸發(fā)器創(chuàng)建語法:復(fù)制代碼 代碼如下:
CREATE TRIGGER trigger name ON table or view {{{FOR|AFTER} [INSERT] [,] [UPDATE],[DELETE] }|INSTEAN OF} AS sql statement
4、觸發(fā)器必須附加到表或視圖上,觸發(fā)器不能單獨存在。AFTER 或 FOR 觸發(fā)器不支持視圖,INSTEAD OF 支持表或視圖。
5、INSERT 觸發(fā)器中,SQL Server 會創(chuàng)建一個插入行的副本,并把該副本插入到一個特殊表 Insert 表中,該表只在觸發(fā)器作用域內(nèi)存在。
6、DELETE 觸發(fā)器中,SQL Server 會創(chuàng)建一個刪除行的副本,并把該副本插入到一個特殊表 Delete 表中,該表只在觸發(fā)器作用域內(nèi)存在。
7、UPDATE 觸發(fā)器中,SQL Server 認(rèn)為更新的記錄是刪除了現(xiàn)有的記錄,插入更新后的新紀(jì)錄,所以 UPDATE 觸發(fā)器中包含 Insert 和 Delete 兩個特殊表,也是只存在觸發(fā)器作用域內(nèi),這兩個表的行數(shù)完全一樣。
8、觸發(fā)器盡可能簡短,因為觸發(fā)器和觸發(fā)器內(nèi)的語句被一同處理,即直到語句執(zhí)行完成才算是觸發(fā)器完成。如果代碼很長那觸發(fā)器運行時間就會很長。下面是個實現(xiàn)自動編號功能的例子:復(fù)制代碼 代碼如下:
– 有兩張表,客戶表和項目表,要求:新建項目時自動生成項目編號,每個不同的客戶的項目的編號從 1 開始 – 項目編號格式為 PJ+ – + 客戶編號 + – + 日期 + – + 流水號 – 如項目編號:PJ-ABCD-120805-0001 create table testAccount – 創(chuàng)建測試客戶表 (tAccName nvarchar(100), – 客戶姓名 tAccId nvarchar(32) – 客戶編號 ) create table testProject – 創(chuàng)建測試項目表 (tProName nvarchar(100), – 項目名稱 tProId nvarchar(32), – 項目編號 tIdAcc nvarchar(100), – 客戶編號 tProGuid nvarchar(64) –guid ) go create trigger T_AutoNumber on testProject after insert as begin declare @one nvarchar(8), – 編號第一部分,PJ @two nvarchar(32), – 編號第二部分,客戶編號 @three nvarchar(8), – 編號第三部分,日期 @four int, – 編號第四部分,流水號 @guid nvarchar(64) –guid set @one= PJ set @three= convert(varchar(8),GETDATE(),112) – 從 Inserted 副本表里獲取當(dāng)前插入數(shù)據(jù)的客戶編碼和 guid select @two=tIdAcc,@guid=tProGuid from Inserted – 獲取編號最后四位 select @four=max(cast(right(tProId,4)as int)) from testProject where tIdAcc=@two – 對每一個新客戶的流水號都是從 1 開始,已存在客戶為最大流水號加 1 if @four is null set @four=0 else set @four=cast(@four as int) set @four=@four+1 update testProject set tProId=@one+ – +@two+ – +@three+ – +right(0000 +cast(@four as varchar),4) where tProGuid=@guid end go – 生成測試表數(shù)據(jù) insert into testAccount values (小小鴨有限公司 , XXYGS) insert into testAccount values (丑小鴨有限公司 , CXY) insert into testProject (tProName,tIdAcc,tProGuid)values (小鴨成長項目 , XXYGS ,newid()) insert into testProject (tProName,tIdAcc,tProGuid)values (小鴨學(xué)游泳項目 , XXYGS ,newid()) insert into testProject (tProName,tIdAcc,tProGuid)values (丑小鴨成長項目 , CXY ,newid()) select * from testProject drop table testAccount drop table testProject
9. 調(diào)試觸發(fā)器:新建查詢窗口,輸入下來代碼,按下 F11 即可逐語句運行下列腳本,進(jìn)入到觸發(fā)器中。也可在觸發(fā)器里設(shè)置斷點,然后按 F11 逐語句執(zhí)行。復(fù)制代碼 代碼如下:
begin tran insert into testProject (tProName,tIdAcc,tProGuid)values (小鴨成長項目 , XXYGS ,newid()) insert into testProject (tProName,tIdAcc,tProGuid)values (小鴨學(xué)游泳項目 , XXYGS ,newid()) insert into testProject (tProName,tIdAcc,tProGuid)values (丑小鴨成長項目 , CXY ,newid()) if @@TRANCOUNT 0 rollback tran
關(guān)于 sqlserver 中怎么實現(xiàn)觸發(fā)器問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識。