觸發器是在對錶進行插入、更新或刪除操作時自動執行的儲存過程觸發器通常用於強制業務規則
觸發器是一種高階約束,可以定義比 check 約束更為複雜的約束
可執行複雜的 sql 語句(if/while/case)
可引用其它表中的列
觸發器定義在特定的表上,與表相關
自動觸發執行
不能直接呼叫
是乙個事務(可回滾)
觸發器的型別
1.after 觸發器
在執行了 insert、update 或 delete 語句操作之後執行 after 觸發器。after觸發器只能在表上指定。
delete 觸發器
insert 觸發器
update 觸發器
2.instead of 觸發器
在指定的操作(insert、update 或 delete 語句)之前被執行,它的功能是不執行指定的操作,而是執行 instead of 觸發器中定義的操作。可以在表和檢視上定義
instead of 觸發器。每張表或檢視上只能為每個觸發動作(insert, update, or delete)建立乙個 instead of 觸發器。
delete 觸發器
insert 觸發器
update 觸發器
觸發器觸發時:
系統自動在記憶體中建立 deleted 表或 inserted 表
唯讀,不允許修改;觸發器執行完成後,自動刪除
inserted 表
臨時儲存了插入或更新後的記錄行
可以從 inserted 表中檢查插入的資料是否滿足業務需求
如果不滿足,則向使用者報告錯誤訊息,並回滾插入操作deleted 表
臨時儲存了刪除或更新前的記錄行
可以從 deleted 表中檢查被刪除的資料是否滿足業務需求
如果不滿足,則向使用者報告錯誤訊息,並回滾刪除操作
inserted 和 deleted 表存放的資訊
create table [dbo].[bank]
( [id] [int] identity(1,1) not null,
[cardid] [char](10) not null,
[transtype] [char](4) null,
[currentmoney] [money] null,
[transmoney] [money] null
)create table [dbo].[transinfo]
( [cardid] [char](10) not null,
[transtype] [char](4) null,
[transmoney] [money] null
)--insert觸發器例項
create trigger trig_transinfo
on transinfo
for insert
asdeclare @type char(4),@outmoney money
declare @mycardid char(10),@balance money
select @type=transtype,@outmoney=transmoney,@mycardid=cardid
from inserted
if (@type='支取')
update bank
set currentmoney=currentmoney-@outmoney,
transtype=@type,transmoney=@outmoney where cardid=@mycardid
else
update bank
set currentmoney=currentmoney+@outmoney,transtype=@type,transmoney=@outmoney where cardid=@mycardid
goinsert into bank values('123456','',1000,'')
insert into transinfo values('123456','支取',200)
insert into transinfo values('123456','存款',10000)
--delete觸發器
create trigger trig_delete_transinfo
on transinfo
for delete
asprint '開始備份資料,請稍後......'
if not exists(select * from sysobjects where name='backuptable')
select * into backuptable from deleted
else
insert into backuptable select * from deleted
print '備份資料成功,備份表中的資料為:'
delete from transinfo
select * from backuptable
go--update觸發器
create trigger trig_update_bank
on bank
for update
asdeclare @beforemoney money,@aftermoney money
select @beforemoney=currentmoney from deleted
select @aftermoney=currentmoney from inserted
if abs(@aftermoney-@beforemoney)>20000
begin
print '交易金額:'+convert(varchar(8),
abs(@aftermoney-@beforemoney))
raiserror ('每筆交易不能超過萬元,交易失敗',16,1)
rollback transaction
endinsert into transinfo values('123456','支取',20001)
觸發器小結
1.如果乙個表的外來鍵在 delete、update 操作上定義了級聯,則不能在該錶上定義instead of delete、instead of update 觸發器
2.如果定義檢視時使用了 with check option,則不允許在其上建立 instead of 觸發器
3.觸發器是「後過濾器」,它在資料修改通過所有規則、預設值之後才執行
4.首先考慮使用約束維護資料庫完整性,僅在必要時才使用觸發器
5.觸發器是在對錶進行插入、更新或刪除操作時自動執行的儲存過程,觸發器通常用於強制業務規則
6.觸發器還是乙個特殊的事務單元,當出現錯誤時,可以執行 rollback transaction回滾撤銷操作
資料庫之 觸發器 基礎
觸發器概述 特殊程式 與函式和儲存過程類似,都屬於pl sql塊 不可以直接呼叫,只能是某種事件觸發 分類 ddl觸發器 dml觸發器 instead of觸發器 替代某個動作的觸發器 系統觸發器 對系統訪問進行控制 觸發器body部分不可以超過32760位元組 一般情況下,非系統觸發器是不能直接呼...
資料庫基礎之觸發器
1.定義 觸發器 trigger 是與表事件相關的特殊的儲存過程,它的執行是由事件來觸發。觸發器經常用於加強資料的完整性約束和業務規則等。2.觸發器和儲存過程的區別 觸發器與儲存過程的唯一區別是觸發器不能執行execute語句呼叫,而是在使用者執行transact sql語句時自動觸發執行。3.作用...
資料庫觸發器
觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...