SQL Server 觸發器詳解

2022-04-19 10:05:12 字數 3605 閱讀 6626

觸發器是一種特殊的儲存過程,它不能被顯式地呼叫,而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。 所以觸發器可以用來實現對錶實施複雜的完整性約束。

sql server2000提供了兩種觸發器:「instead of」 和「after」 觸發器。

乙個表或檢視的每乙個修改動作(insert、update和delete)都可以有乙個「instead of」 觸發器,乙個表的每個修改動作都可以有多個「after」觸發器。

2.1 「instead of」觸發器

1

alter

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)

存放更新後的記錄

存放更新前的記錄

create

trigger

trigger_name

on

as 相應t-sql語句

alter

trigger

trigger_name

on

as 相應t-sql語句

drop

trigger trigger_name

8.1 檢視資料庫中所有觸發器

select

*from sysobjects where xtype=

'tr

8.2 檢視單個觸發器

exec sp_helptext '

觸發器名

'

兩張表:學生(學號 int, 姓名 varchar)、借書記錄(學號 int, 圖書編號 int)

實現功能:在刪除學生表時,如果該學生仍有借書記錄(未還)則不能刪除

alter

trigger

trigger_學生_delete

on學生

instead

ofdelete

asbegin

ifnot

exists(select

*from 借書記錄, deleted where 借書記錄.學號 =

deleted.學號)

delete

from 學生 where 學生.學號 in (select 學號 from

deleted)

end

10.1 在「訂單」表中建立觸發器,當向「訂單」表中插入一條訂單記錄時,檢查「商品」表的貨品狀態「狀態」是否為1(正在整理),則不能往「訂單」表加入該訂單。

create

trigger

trigger_訂單_insert

on訂單

after

insert

asif (select 狀態 from 商品, inserted where 商品.pid = inserted.pid)=

1begin

print

'the goods is being processed

'print

'the order cannot be committed

'rollback

transaction

--回滾,避免加入

end

10.2 在「訂單」表建立乙個插入觸發器,在新增一條訂單時,減少「商品」表相應的貨品記錄中的庫存。

create

trigger

trigger_訂單_insert2

on訂單

after

insert

asupdate 商品 set 數量 = 數量 -

inserted.數量

from

商品, inserted

where 商品.pid = inserted.pid

10.3 在「商品」表建立刪除觸發器,實現「商品」表和「訂單」表的級聯刪除。

create

trigger

goodsdelete trigger_商品_delete

on商品

after

delete

asdelete

from 訂單 where 訂單.pid in (select pid fromdeleted)

10.4 在「訂單」表建立乙個更新觸發器,監視「訂單」表的「訂單日期」列,使其不能被「update」.

create

trigger

trigger_訂單_update

on訂單

after

update

asif

update

(訂單日期)

begin

raiserror('

訂單日期不能手動修改

',10,1

)

rollback

transaction

end

10.5 在「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品必須要在「商品」表中一定存在。

create

trigger

trigger_訂單_insert3

on訂單

after

insert

asif (select

count(*) from 商品, inserted where 商品.pid = inserted.pid)=

0begin

print

'商品不存在

'rollback

transaction

end

10.6 「訂單」表建立乙個插入觸發器,保證向「訂單」表插入的貨品資訊要在「訂單日誌」表中新增

alter

trigger

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...