一、觸發器是一種特殊的儲存過程,不能被顯式呼叫,只能在對錶進行insert、update、delete操作時被自動啟用。所以觸發器可以用來實現對錶進行複雜的完整性約束。二、 sql server為每個觸發器都建立了兩個專用表:inserted表和deleted表。這兩個表由系統來維護,它們存在於記憶體中而不是資料庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同,觸發器執行完成後,與該觸發器相關的這兩個表也被刪除。
對錶的操作
inserted邏輯表
deleted邏輯表
增加記錄(insert)
存放增加的記錄
無刪除記錄(delete)
無存放被刪除的記錄
修改記錄(update)
存放更新後的記錄
存放更新前的記錄 三、
for、after、instead of觸發器
after:觸發器在觸發它們的語句完成後執行。如果該語句因錯誤而失敗,觸發器將不會執行。不能為檢視指定after觸發器,只能為表指定該觸發器。可以為每個觸發操作(insert、update、delete)指定多個after觸發器。如果表有多個after觸發器,可使用sp_settriggerorder定義哪個after觸發器最先激發,哪個最後激發。除第乙個和最後乙個觸發器外,所有其他的after觸發器的激發順序不確定,並且無法控制。
for:等同於after
instead of:該觸發器代替觸發操作執行。可在表和檢視上指定instead of觸發器。只能為每個觸發操作(insert、update、delete)定義乙個instead of觸發器。instead of觸發器可用於對insert和update語句中提供的資料值執行增強的完整性檢查。
四、 觸發器的使用
1、建立觸發器:
create trigger trigger_name
on
[ insert, update,delete ]
assql_statement
2、刪除觸發器:
drop trigger trigger_name
3、檢視資料庫中已有的觸發器:
select * from sysobjects where xtype='tr'
4、檢視單個觸發器:
exec sp_helptext
'觸發器名'5
、修改觸發器:
alter trigger trigger_name
on
[ insert, update,delete ]
assql_statement
五、觸發器的例項
1、在orders表中建立觸發器,當向orders表中插入一條記錄時,檢查goods表的貨品狀態status是否為1。是,則不能往orders表加入該訂單。
if (object_id('
tgr_orders_insert
', '
tr') is not null
) drop trigger [tgr_orders_insert];
gocreate trigger [tgr_orders_insert]
on [orders]
after insert
asif (select [status] from [goods],[inserted] where [goods].name=[inserted].name)=1
begin
'the goods is being processed
'the order cannot be committed
'rollback transaction --回滾﹐避免加入
end
觸發器的應用
複製**
--案例一:
alter trigger tr_info_add on info
forinsert,delete
asprint
'改變了一條資料'go
insert into info values(
'p006
','李四
','1
','n002
','1999-3-2')
--案例二:建乙個觸發器,在觸發器中用select顯示inserted表和deleted表中的資料。
複製**
create trigger tr_fruit_upp on fruit
forupdate as
--當水果表修改,就向fruitdetails 新增資料
--水果代號--fruitcode,number的減少量--count
--在觸發器中有2個臨時表,表名是:inserted,deleted,這2個臨時表最多只有一條資料
'deleted表的資料
'select * from
deleted
'inserted表中的資料
'select * from
inserted
go複製**
update fruit
set numbers=95
where ids='
k003'
--案例三:水果表改變numbers列時,向orderdetails表中新增資料。
複製**
goalter trigger tr_fruit_update on fruit
forupdate
as--當水果表修改,就向fruitdetails中新增資料
--水果代號--fruitcode;number的減少量--count
--把修改的對應資料取出來。水果代號,數量差
declare @code varchar(50)
declare @num1
intdeclare @num2
intdeclare @num
intselect @code=ids ,@num1=numbers from
deleted
select @num2=numbers from
inserted
set @num=@num1-@num2
--向orderdetails表中執行插入操作
insert into orderdetails (fruitcode,[count]) values(@code,@num)
複製**
--案例四:instead of觸發器,刪除info表的資料時,先刪除work和family的資料,再刪info相應的資料。
複製**
select * from
info
select * from
work
select * from
family
delete
from info where code='
p002
'drop trigger tr_info_add --刪除觸發器
goalter trigger tr_info_delete on info
instead of delete
asdeclare @code varchar(50)
select @code=code from
deleted
delete
from work where infocode=@code
delete
from family where infocode=@code
delete
from info where code=@code
go複製**
go複製**
資料庫觸發器
觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...
資料庫觸發器
最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...
資料庫 觸發器
觸發器的概念 是使用者定義在關係表上的一類有事件驅動的特殊過程。一旦定義,任何對錶的增刪改操作均有伺服器自動啟用相應的觸發器,在dbms核心層進行集中的完整性控制。類似於約束,但比約束更靈活。觸發器的分類 dml觸發器 dml data manipulation language 觸發器是當資料庫伺...