先來看一小段程式
有如下三張表:
帳戶(編號,姓名,餘額,建立日期,儲蓄所編號)
儲蓄所(編號,名稱,位址,人數,所屬城市)
借貸(帳戶,借貸型別,金額,日期)
1create
trigger
tri_bank_delete
2on bank for
deleteas3
declare
@count_account_of_bank
int4
select
@count_account_of_bank
=count(*)5
from
account
6where bank_id=(select bank_id from
deleted)
7group
bybank_id8if
@count_account_of_bank
>09
begin
10print
'該儲蓄所中有賬戶資訊,不許刪除!'11
rollback
transaction
12end
這是乙個簡單的建立觸發器的小程式。下面我們來看看觸發器的定義和使用
一: 觸發器是一種特殊的儲存過程﹐它不能被顯式地呼叫﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性約束。
二: sql server為每個觸發器都建立了兩個專用表:inserted表和deleted表。
這兩個表由系統來維護﹐它們存在於記憶體中而不是在資料庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同。觸發器執行 完成後﹐與該觸發器相關的這兩個表也被刪除。
deleted表存放由於執行delete或update語句而要從表中刪除的所有行。
inserted表存放由於執行insert或update語句而要向表中插入的所有行。
三:instead of 和 after觸發器
sql server2000提供了兩種觸發器:instead of 和after 觸發器。這兩種觸發器的差別在於他們被啟用的同:
instead of觸發器用於替代引起觸發器執行的t-sql語句。除表之外﹐instead of 觸發器也可以用於檢視﹐用來擴充套件檢視可以支援的更新操作。
after觸發器在乙個insert,update或deleted語句之後執行﹐進行約束檢查等動作都在after觸發器被啟用之前發生。after觸發器只能用於表。
乙個表或檢視的每乙個修改動作(insert,update和delete)都可以有乙個instead of 觸發器﹐乙個表的每個修改動作都可以有多個after觸發器。
四:觸發器的執行過程
如果乙個insert﹑update或者delete語句違反了約束﹐那么after觸發器不會執行﹐因為對約束的檢查是在after觸發器被激動之前發生的。所以after觸發器不能超越約束。
instead of 觸發器可以取代激發它的操作來執行。它在inserted表和deleted表剛剛建立﹐其它任何操作還沒有發生時被執行。因為instead of 觸發器在約束之前執行﹐所以它可以對約束進行一些預處理。
五:使用t-sql語句來建立觸發器
基本語句如下:
1create
trigger
trigger_name
2on
3 4
[insert, update,delete ]5
as6 sql_statement
六:刪除觸發器:
基本語句如下:
drop trigger trigger_name
七:檢視資料庫中已有觸發器:
-- 檢視資料庫已有觸發器
use jxcsoftware
go select * from sysobjects where xtype='tr'
-- 檢視單個觸發器
exec sp_helptext '觸發器名'
八:修改觸發器:
基本語句如下:
1alter
trigger
trigger_name
2on
3 4
[insert, update,delete ]5
as6 sql_statement
九:相關示例:
1:在orders表中建立觸發器﹐當向orders表中插入一條訂單記錄時﹐檢查goods表的貨品狀態status是否為1(正在整理)﹐是﹐則不能往orders表加入該訂單。
1create
trigger
orderinsert 2on
orders
3 after insert4as
5if (select status from
goods,inserted
6where goods.name=inserted.goodsname)=17
begin
8print
'the goods is being processed'9
'the order cannot be committed'10
rollback
transaction
--回滾﹐避免加入
11end
2:在orders表建立乙個插入觸發器﹐在新增一條訂單時﹐減少goods表相應的貨品記錄中的庫存。
1create
trigger
orderinsert1 2on
orders
3 after insert4as
5update goods set storage=storage-
inserted.quantity
6from
goods,inserted
7where
8 goods.name=inserted.goodsname
3:在goods表建立刪除觸發器﹐實現goods表和orders表的級聯刪除。
1create
trigger
goodsdelete 2on
goods
3 after delete4as
5delete
from
orders
6where goodsname in
7 (select name from deleted)
4:在orders表建立乙個更新觸發器﹐監視orders表的訂單日期(orderdate)列﹐使其不能手工修改.
1create
trigger
orderdateupdate 2on
orders
3 after update4as
5ifupdate
(orderdate)
6begin
7raiserror('
orderdate cannot be modified
',10,1) 8
rollback
transaction
9end
5:在orders表建立乙個插入觸發器﹐保證向orders表插入的貨品名必須要在goods表中一定存在。
1create
trigger
orderinsert3 2on
orders
3 after insert4as
5if (select
count(*) from goods,inserted where goods.name=inserted.goodsname)=06
begin
7print
'no entry in goods for this order'8
rollback
transaction
9end
6:orders表建立乙個插入觸發器,保證向orders表插入的貨品資訊要在order表中新增
1alter
trigger
addorder 2on
orders
3for
insert4as
5insert
into
order
6select inserted.id, inserted.goodname,inserted.number
from inserted
mysql之觸發器trigger
觸發器 trigger 監視某種情況,並觸發某種操作。觸發器建立語法四要素 1.監視地點 table 2.監視事件 insert update delete 3.觸發時間 after before 4.觸發事件 insert update delete 語法 create trigger trigg...
mysql之觸發器trigger
觸發器 trigger 監視某種情況,並觸發某種操作。觸發器建立語法四要素 1.監視地點 table 2.監視事件 insert update delete 3.觸發時間 after before 4.觸發事件 insert update delete 語法 create trigger trigg...
mysql之觸發器trigger
觸發器 trigger 監視某種情況,並觸發某種操作。觸發器建立語法四要素 1.監視地點 table 2.監視事件 insert update delete 3.觸發時間 after before 4.觸發事件 insert update delete 語法 create trigger trigg...