資料庫的觸發器

2022-08-11 03:42:16 字數 3826 閱讀 9913

一、觸發器是一種特殊的儲存過程,不能被顯式呼叫,只能在對錶進行insert、update、delete操作時被自動啟用。所以觸發器可以用來實現對錶進行複雜的完整性約束。

二、 sql server為每個觸發器都建立了兩個專用表:inserted表和deleted表。這兩個表由系統來維護,它們存在於記憶體中而不是資料庫中。這兩個表的結構總是與被該觸發器作用的表的結構相同,觸發器執行完成後,與該觸發器相關的這兩個表也被刪除。

對錶的操作

inserted邏輯表

deleted邏輯表

增加記錄(insert)

存放增加的記錄

無刪除記錄(delete)

無存放被刪除的記錄

修改記錄(update)

存放更新後的記錄

存放更新前的記錄 三、

for、after、instead of觸發器

after:觸發器在觸發它們的語句完成後執行。如果該語句因錯誤而失敗,觸發器將不會執行。不能為檢視指定after觸發器,只能為表指定該觸發器。可以為每個觸發操作(insert、update、delete)指定多個after觸發器。如果表有多個after觸發器,可使用sp_settriggerorder定義哪個after觸發器最先激發,哪個最後激發。除第乙個和最後乙個觸發器外,所有其他的after觸發器的激發順序不確定,並且無法控制。

for:等同於after

instead of:該觸發器代替觸發操作執行。可在表和檢視上指定instead of觸發器。只能為每個觸發操作(insert、update、delete)定義乙個instead of觸發器。instead of觸發器可用於對insert和update語句中提供的資料值執行增強的完整性檢查。

四、 觸發器的使用

1、建立觸發器:

create trigger trigger_name

on

[ insert, update,delete ]

assql_statement

2、刪除觸發器:

drop trigger trigger_name

3、檢視資料庫中已有的觸發器:

select * from sysobjects where xtype='tr'

4、檢視單個觸發器:

exec sp_helptext

'觸發器名'5

、修改觸發器:

alter trigger trigger_name

on

[ insert, update,delete ]

assql_statement

五、觸發器的例項

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

if (object_id('

tgr_orders_insert

', '

tr') is not null

) drop trigger [tgr_orders_insert];

gocreate trigger [tgr_orders_insert]

on [orders]

after insert

asif (select [status] from [goods],[inserted] where [goods].name=[inserted].name)=1

begin

print

'the goods is being processed

'print

'the order cannot be committed

'rollback transaction --回滾﹐避免加入

end

觸發器的應用

複製**

--案例一:

alter trigger tr_info_add on info

forinsert,delete

asprint

'改變了一條資料'go

insert into info values(

'p006

','李四

','1

','n002

','1999-3-2')

--案例二:建乙個觸發器,在觸發器中用select顯示inserted表和deleted表中的資料。

複製**

create trigger tr_fruit_upp on fruit

forupdate as

--當水果表修改,就向fruitdetails 新增資料

--水果代號--fruitcode,number的減少量--count

--在觸發器中有2個臨時表,表名是:inserted,deleted,這2個臨時表最多只有一條資料

print

'deleted表的資料

'select * from

deleted

print

'inserted表中的資料

'select * from

inserted

go複製**

update fruit

set numbers=95

where ids='

k003'

--案例三:水果表改變numbers列時,向orderdetails表中新增資料。

複製**

goalter trigger tr_fruit_update on fruit

forupdate

as--當水果表修改,就向fruitdetails中新增資料

--水果代號--fruitcode;number的減少量--count

--把修改的對應資料取出來。水果代號,數量差

declare @code varchar(50)

declare @num1

intdeclare @num2

intdeclare @num

intselect @code=ids ,@num1=numbers from

deleted

select @num2=numbers from

inserted

set @num=@num1-@num2

--向orderdetails表中執行插入操作

insert into orderdetails (fruitcode,[count]) values(@code,@num)

複製**

--案例四:instead of觸發器,刪除info表的資料時,先刪除work和family的資料,再刪info相應的資料。

複製**

select * from

info

select * from

work

select * from

family

delete

from info where code='

p002

'drop trigger tr_info_add --刪除觸發器

goalter trigger tr_info_delete on info

instead of delete

asdeclare @code varchar(50)

select @code=code from

deleted

delete

from work where infocode=@code

delete

from family where infocode=@code

delete

from info where code=@code

go複製**

go複製**

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...

資料庫觸發器

最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...

資料庫 觸發器

觸發器的概念 是使用者定義在關係表上的一類有事件驅動的特殊過程。一旦定義,任何對錶的增刪改操作均有伺服器自動啟用相應的觸發器,在dbms核心層進行集中的完整性控制。類似於約束,但比約束更靈活。觸發器的分類 dml觸發器 dml data manipulation language 觸發器是當資料庫伺...