SQL之trigger(觸發器)

2022-06-29 09:09:12 字數 4508 閱讀 5213

先來看一小段程式

有如下三張表:

帳戶(編號,姓名,餘額,建立日期,儲蓄所編號)

儲蓄所(編號,名稱,位址,人數,所屬城市)

借貸(帳戶,借貸型別,金額,日期)

1

create

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語句來建立觸發器

基本語句如下: 

1

create

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 '觸發器名' 

八:修改觸發器:

基本語句如下: 

1

alter

trigger

trigger_name

2on

3 4

[insert, update,delete ]5

as6 sql_statement

九:相關示例:

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

1

create

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

print

'the order cannot be committed'10

rollback

transaction

--回滾﹐避免加入

11end

2:在orders表建立乙個插入觸發器﹐在新增一條訂單時﹐減少goods表相應的貨品記錄中的庫存。 

1

create

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表的級聯刪除。 

1

create

trigger

goodsdelete 2on

goods

3 after delete4as

5delete

from

orders

6where goodsname in

7 (select name from deleted)

4:在orders表建立乙個更新觸發器﹐監視orders表的訂單日期(orderdate)列﹐使其不能手工修改. 

1

create

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表中一定存在。 

1

create

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表中新增 

1

alter

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