觸發器是一種特殊的儲存過程,它不能被顯式地呼叫,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。 所以觸發器可以用來實現對錶實施複雜的完整性約束。
sql server2000提供了兩種觸發器:「instead of」 和「after」 觸發器。
乙個表或檢視的每乙個修改動作(insert、update和delete)都可以有乙個「instead of」 觸發器,乙個表的每個修改動作都可以有多個「after」觸發器。
2.1 「instead of」觸發器
1alter
trigger
trigger_學生_delete2on
學生3 instead of
delete4as
5begin
6select 學號, 姓名 from
deleted
7end89
delete
from 學生 where 學號 =
4
上例中定義了「trigger學生_delete」觸發器,該觸發器從「delete」表中列印出所要刪除的學生.在執行「delete」操作後,會發現「學號 = 4」的學生並未被刪除, 原因在於「trigger學生delete」替代了所要執行的「delete from 學生 where 學號 = 4」語句,而在「trigger學生_delete」中並未真正刪除學生。
2.2 「after」觸發器sql server為每個觸發器都建立了兩個專用表:inserted表和deleted表。
對錶的操作
inserted邏輯表
deleted邏輯表
增加記錄(insert)
存放增加的記錄
無刪除記錄(delete)
無存放被刪除的記錄
修改記錄(update)
存放更新後的記錄
存放更新前的記錄
createtrigger
trigger_name
on
as 相應t-sql語句
altertrigger
trigger_name
on
as 相應t-sql語句
droptrigger trigger_name
8.1 檢視資料庫中所有觸發器
select*from sysobjects where xtype=
'tr
8.2 檢視單個觸發器
exec sp_helptext '觸發器名
'
兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)
實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除
altertrigger
trigger_學生_delete
on學生
instead
ofdelete
asbegin
ifnot
exists(select
*from 借書記錄, deleted where 借書記錄.學號 =
deleted.學號)
delete
from 學生 where 學生.學號 in (select 學號 from
deleted)
end
10.1 在「訂單」表中建立觸發器,當向「訂單」表中插入一條訂單記錄時,檢查「商品」表的貨品狀態「狀態」是否為1(正在整理),則不能往「訂單」表加入該訂單。
createtrigger
trigger_訂單_insert
on訂單
after
insert
asif (select 狀態 from 商品, inserted where 商品.pid = inserted.pid)=
1begin
'the goods is being processed
'the order cannot be committed
'rollback
transaction
--回滾,避免加入
end
10.2 在「訂單」表建立乙個插入觸發器,在新增一條訂單時,減少「商品」表相應的貨品記錄中的庫存。
createtrigger
trigger_訂單_insert2
on訂單
after
insert
asupdate 商品 set 數量 = 數量 -
inserted.數量
from
商品, inserted
where 商品.pid = inserted.pid
10.3 在「商品」表建立刪除觸發器,實現「商品」表和「訂單」表的級聯刪除。
createtrigger
goodsdelete trigger_商品_delete
on商品
after
delete
asdelete
from 訂單 where 訂單.pid in (select pid fromdeleted)
10.4 在「訂單」表建立乙個更新觸發器,監視「訂單」表的「訂單日期」列,使其不能被「update」.
createtrigger
trigger_訂單_update
on訂單
after
update
asif
update
(訂單日期)
begin
raiserror('
訂單日期不能手動修改
',10,1
)
rollback
transaction
end
10.5 在「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品必須要在「商品」表中一定存在。
createtrigger
trigger_訂單_insert3
on訂單
after
insert
asif (select
count(*) from 商品, inserted where 商品.pid = inserted.pid)=
0begin
'商品不存在
'rollback
transaction
end
10.6 「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品資訊要在「訂單日誌」表中新增
altertrigger
trigger_訂單_insert
on訂單
forinsert
asinsert
into 訂單日誌 select inserted.id, inserted.pid,inserted.數量 from inserted
觸發器詳解
觸發器是乙個特殊的儲存過程,不同的是儲存過程要用call來呼叫,而觸發器不需要使用call 也不需要手工啟動,只要當乙個預定義的事件發生的時候,就會被mysql自動呼叫。建立觸發器 語法如下 create trigger trigger name trigger time trigger event...
觸發器詳解
mysql包含對觸發器的支援。觸發器是一種與表操作有關的資料庫物件,當觸發器所在表上出現指定事件時,將呼叫該物件,即表的操作事件觸發表上的觸發器的執行。建立觸發器 在mysql中,建立觸發器語法如下 如下 create trigger trigger name trigger time trigge...
sqlserver觸發器複習
create table a a1 int,a2 int create table b b1 int,b2 int insert into a values 1,0 insert into b values 1,0 create trigger tri update a2 a on a for up...