觸發器是一種特殊的存儲過程,它不能被顯式地調用,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地激活。 因此觸發器能夠用來實現對錶實施複雜的完整性約束。html
SQL Server2000提供了兩種觸發器:「Instead of」 和「After」 觸發器。sql
一個表或視圖的每個修改動做(Insert、Update和Delete)均可以有一個「Instead of」 觸發器,一個表的每一個修改動做均可以有多個「After」觸發器。數據庫
1
2
3
4
5
6
7
8
9
|
alter
trigger
trigger_學生_Delete
on
學生
instead
of
Delete
as
begin
select
學號, 姓名
from
deleted
end
delete
from
學生
where
學號 = 4
|
上例中定義了「trigger學生_Delete」觸發器,該觸發器從「delete」表中打印出所要刪除的學生.在執行「delete」操做後,會發現「學號 = 4」的學生並未被刪除, 緣由在於「trigger學生Delete」替代了所要執行的「delete from 學生 where 學號 = 4」語句,而在「trigger學生_Delete」中並未真正刪除學生。編碼
SQL Server爲每一個觸發器都建立了兩個專用表:Inserted表和Deleted表。spa
對錶的操做 | Inserted邏輯表 | Deleted邏輯表 |
---|---|---|
增長記錄(insert) | 存放增長的記錄 | 無 |
刪除記錄(delete) | 無 | 存放被刪除的記錄 |
修改記錄(update) | 存放更新後的記錄 | 存放更新前的記錄 |
若是一個Insert﹑update或者delete語句違反了約束,那麼這條SQL語句就沒有執行成功,所以「After」觸發器也不會被激活。日誌
「Instead of」 觸發器能夠取代激發它的操做來執行。它在Inserted表和Deleted表剛剛創建,其它任何操做尚未發生時被執行。由於「Instead of」 觸發器在約束以前執行,因此它能夠對約束進行一些預處理。code
1
2
3
4
|
create
trigger
trigger_name
on
{table_name|view_name}
{
After
|
Instead
of
} {
insert
|
update
|
delete
}
as
相應T-SQL語句
|
1
2
3
4
|
alter
trigger
trigger_name
on
{table_name|view_name}
{
After
|
Instead
of
} {
insert
|
update
|
delete
}
as
相應T-SQL語句
|
1
|
drop
trigger
trigger_name
|
1
|
select
*
from
sysobjects
where
xtype=
'TR'
|
1
|
exec
sp_helptext
'觸發器名'
|
兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)htm
實現功能:在刪除學生表時,若是該學生仍有借書記錄(未還)則不能刪除blog
1
2
3
4
5
6
7
8
|
alter
trigger
trigger_學生_Delete
on
學生
instead
of
Delete
as
begin
if
not
exists(
select
*
from
借書記錄, deleted
where
借書記錄.學號 = deleted.學號)
delete
from
學生
where
學生.學號
in
(
select
學號
from
deleted)
end
|
1
2
3
4
5
6
7
8
9
10
|
create
trigger
trigger_訂單_insert
on
訂單
after
insert
as
if (
select
狀態
from
商品, inserted
where
商品.pid = inserted.pid)=1
begin
print
'the goods is being processed'
print
'the order cannot be committed'
rollback
transaction
--回滾,避免加入
end
|
1
2
3
4
5
6
7
|
create
trigger
trigger_訂單_insert2
on
訂單
after
insert
as
update
商品
set
數量 = 數量 - inserted.數量
from
商品, inserted
where
商品.pid = inserted.pid
|
1
2
3
4
5
|
create
trigger
goodsdelete trigger_商品_delete
on
商品
after
delete
as
delete
from
訂單
where
訂單.pid
in
(
select
pid
from
deleted)
|
1
2
3
4
5
6
7
8
9
|
create
trigger
trigger_訂單_update
on
訂單
after
update
as
if
update
(訂單日期)
begin
raiserror(
'訂單日期不能手動修改'
,10,1)
rollback
transaction
end
|
1
2
3
4
5
6
7
8
9
|
create
trigger
trigger_訂單_insert3
on
訂單
after
insert
as
if (
select
count
(*)
from
商品, inserted
where
商品.pid = inserted.pid)=0
begin
print
'商品不存在'
rollback
transaction
end
|
1
2
3
4
5
|
alter
trigger
trigger_訂單_insert
on
訂單
for
insert
as
insert
into
訂單日誌
select
inserted.Id, inserted.pid,inserted.數量
from
inserted
|