對(duì)表的操作 | Inserted邏輯表 | Deleted邏輯表 |
---|---|---|
增加記錄(insert) | 存放增加的記錄 | 無 |
刪除記錄(delete) | 無 | 存放被刪除的記錄 |
修改記錄(update) | 存放更新后的記錄 | 存放更新前的記錄 |
4. 觸發(fā)器的執(zhí)行過程
5. 創(chuàng)建觸發(fā)器
create trigger trigger_name on {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應(yīng)T-SQL語句
6. 修改觸發(fā)器:
alter trigger trigger_name on {table_name|view_name} {After|Instead of} {insert|update|delete} as 相應(yīng)T-SQL語句
7. 刪除觸發(fā)器:
drop trigger trigger_name
8. 查看數(shù)據(jù)庫中已有觸發(fā)器:
8.1 查看數(shù)據(jù)庫中所有觸發(fā)器
select * from sysobjects where xtype='TR'
8.2 查看單個(gè)觸發(fā)器
exec sp_helptext '觸發(fā)器名'
9. “Instead of”相關(guān)示例:
兩張表:學(xué)生(學(xué)號(hào) int, 姓名 varchar)、借書記錄(學(xué)號(hào) int, 圖書編號(hào) int)
實(shí)現(xiàn)功能:在刪除學(xué)生表時(shí),如果該學(xué)生仍有借書記錄(未還)則不能刪除
alter trigger trigger_學(xué)生_Delete on 學(xué)生 instead of Delete as begin if not exists(select * from 借書記錄, deleted where 借書記錄.學(xué)號(hào) = deleted.學(xué)號(hào)) delete from 學(xué)生 where 學(xué)生.學(xué)號(hào) in (select 學(xué)號(hào) from deleted) end
10. “After”觸發(fā)器
10.1 在“訂單”表中建立觸發(fā)器,當(dāng)向“訂單”表中插入一條訂單記錄時(shí),檢查“商品”表的貨品狀態(tài)“狀態(tài)”是否為1(正在整理),則不能往“訂單”表加入該訂單。
create trigger trigger_訂單_insert on 訂單 after insert as if (select 狀態(tài) from 商品, inserted where 商品.pid = inserted.pid)=1 begin print 'the goods is being processed' print 'the order cannot be committed' rollback transaction --回滾,避免加入 end
10.2 在“訂單”表建立一個(gè)插入觸發(fā)器,在添加一條訂單時(shí),減少“商品”表相應(yīng)的貨品記錄中的庫存。
create trigger trigger_訂單_insert2 on 訂單 after insert as update 商品 set 數(shù)量 = 數(shù)量 - inserted.數(shù)量 from 商品, inserted where 商品.pid = inserted.pid
10.3 在“商品”表建立刪除觸發(fā)器,實(shí)現(xiàn)“商品”表和“訂單”表的級(jí)聯(lián)刪除。
create trigger goodsdelete trigger_商品_delete on 商品 after delete as delete from 訂單 where 訂單.pid in (select pid from deleted)
10.4 在“訂單”表建立一個(gè)更新觸發(fā)器,監(jiān)視“訂單”表的“訂單日期”列,使其不能被“update”.
create trigger trigger_訂單_update on 訂單 after update as if update(訂單日期) begin raiserror('訂單日期不能手動(dòng)修改',10,1) rollback transaction end
10.5 在“訂單”表建立一個(gè)插入觸發(fā)器,保證向“訂單”表插入的貨品必須要在“商品”表中一定存在。
create trigger trigger_訂單_insert3 on 訂單 after insert as if (select count(*) from 商品, inserted where 商品.pid = inserted.pid)=0 begin print '商品不存在' rollback transaction end
10.6 “訂單”表建立一個(gè)插入觸發(fā)器,保證向“訂單”表插入的貨品信息要在“訂單日志”表中添加
alter trigger trigger_訂單_insert on 訂單 for insert as insert into 訂單日志 select inserted.Id, inserted.pid,inserted.數(shù)量 from inserted
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
標(biāo)簽:池州 大同 黃山 濱州 文山 新鄉(xiāng) 東營(yíng) 來賓
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server:觸發(fā)器實(shí)例詳解》,本文關(guān)鍵詞 SQL,Server,觸發(fā)器,實(shí)例,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。