sql觸發器例項16.2.3 insert觸發器
例項1 建立insert觸發器
為student表建立觸發器s_insert,當向student表中插入資料時,要求學號必須以「97」開頭,且課程號cno必須在course表中,否則取消插入操作。例項**如下。
create trigger s_insert
on student
for insert as
declare @s_no varchar(4), @s_cno int
select @s_no= sno, @s_cno=cno
from inserted
if (left(@s_no,2)!='97')
begin
rollback transaction
raiserror('輸入的學號:%s不是97級的學生,請確認後重新錄入!',16,1, @s_no)
endif(@s_cno not in (select cno from course))
begin
rollback transaction
raiserror('輸入的課程號:%d在course表中不存在,請確認後重新錄入!',16,1, @s_cno)
end當通過如下語句向student表中插入資料時:
insert into student values('9602','王永','機械工程','男',2,76,'必修')
由於插入資料的學號為「9602」,並不是以「97」開頭,所以執行s_insert觸發器時,將執行「rollback transaction」語句,取消完成的工作,並執行raiserror語句給出錯誤資訊。
執行結果如下。
輸入的學號:9602不是97級的學生,請確認後重新錄入!
當通過如下語句向student表中插入資料時:
insert into student values('9702','王永','機械工程','男',12,76,'必修')
由於課程號12在course表中不存在,所以執行s_insert觸發器時,將執行「rollback transaction」語句,取消工作,並執行raiserror語句給出錯誤資訊。執行結果:
輸入的課程號:12在course表中不存在,請確認後重新錄入!
可以在乙個表上建立多個觸發器,資料庫把乙個表中所有觸發器都看作同一事務的一部分。因此只要其中乙個觸發器執行了rollback tran saction語句,那麼所有的操作(與該insert語句有關)都將被取消。
16.2.4 delete觸發器
例項2 建立delete觸發器
為student表建立delete觸發器s_delete,當一次刪除的記錄大於一行或者刪除記錄的課程為本系教師所開設時,取消刪除操作。例項**:
create trigger s_delete
on student
for delete as
declare @rowcount int
select @rowcount=@@rowcount
if @rowcount>1
begin
rollback transaction
raiserror('當前要刪除的記錄數為%d,一次只允許刪除一行記錄!',16,1,
@rowcount)
enddeclare @s_dname varchar(16), @s_cno int
select @s_dname=dname, @s_cno=cno
from deleted
if(@s_cno in (select cno from teacher where dname=@s_dname))
begin
rollback transaction
raiserror('刪除記錄的課程為本系即%s系教師所開設,不允許刪除!',16,1,
@s_dname)
end當通過如下語句從student表中刪除資料時:
delete student where sno=』9706』
執行結果如下。
當前要刪除的記錄數為4,一次只允許刪除一行記錄!
當使用者從student表執行delete語句時,dbms就啟用觸發器s_delete,該觸發器首先判斷要刪除記錄的行數,只要多於一條,就取消刪除操作。當刪除的記錄只有一行時,觸發器繼續判斷刪除的記錄的課程是否為本系教師所開設,如果是,就取消刪除操作,否則就完成刪除操作。如下面的刪除**:
delete student where sno=』9705』 and cno=8
執行結果如下。
刪除記錄的課程為本系即電子工程 系教師所開設,不允許刪除!
說明 在sql server中執行truncate table語句,從表中刪除所有的行時,不會觸發delete觸發器。
16.2.5 update觸發器
特定的表上執行update語句時,會觸發update觸發器。update操作包括兩個部分:先將需要更新的內容從表中刪除,然後插入新值。因此update觸發器同時涉及到刪除表和插入表。
例項3 建立update觸發器
為course表建立update觸發器c_update,當course表的cno和cname列(第1、2列)被更新時,觸發器給出提示資訊,該兩列不能被更新,並回滾事務。當其餘的列(第3、4、5列)被更新時,觸發器將更新前後的資料寫入c_upinfo表中。例項**如下。
1.建立跟蹤資訊表c_upinfo
create table c_upinfo
(oper_time smalldatetime,
date_type char(3),
cno int ,
cname char(30),
ctime int,
scount int,
ctest smalldatetime,
)2.建立update觸發器c_update
create trigger c_update
on course
for update as
if(columns_updated()&3)>0
begin
rollback transaction
raiserror('course表的cno列和cname列中的資料不允許被更新!',16,1)
endif(columns_updated()&28)>0
begin
insert into c_upinfo(oper_time, date_type,cno,cname,ctime,scount,
ctest)
select getdate(),』old』,del.cno,del.cname, del.ctime, del.scount,
del.ctest
from deleted as del
insert into c_upinfo(oper_time, date_type,cno,cname,ctime,scount,
ctest)
select getdate(),』new』,ins.cno,ins.cname, ins.ctime, ins.scount,
ins.ctest
from inserted as ins
end當通過下面的**更新course表的cname列的值:
update course
set cname = '線性代數基礎'
where cno = 4
執行結果如下。
course表的cno列和cname列中的資料不允許被更新!
此時檢視cno=4的課程名稱:
select cname from course where cno=4
執行結果如圖16.2所示。
圖16.2 cno=4的課程名稱
可見,cname列的值並沒有被更新。而通過下面**更新cno和cname列以外的資訊時:
update course
set ctime=32,scount=90, ctest='2006-9-15'
where cno = 4
此時檢視cno = 4的課程資訊:
select * from course where cno=4
執行結果如圖16.3所示:
圖16.3 cno = 4的課程資訊
可見,該記錄已經被更新。
檢視跟蹤資訊表c_upinfo中的資料:
select * from c_upinfo
執行結果如圖16.4所示。
圖16.4 表c_upinfo中的資料
該錶詳細記錄了course表的更新時間以及更新前後的資料。
sql觸發器使用
sql觸發器 觸發器是對錶進行插入 更新 刪除的時候會自動執行的特殊儲存過程。create trigger 觸發器名稱 on 觸發的表 for delete,insert,update 選擇觸發器型別 as 觸發後要做的語句 t sql語句 go 結束標記 例子 我需要在此表新增時候執行比如我新增值...
觸發器使用
觸發器是一種特殊的儲存過程,她不能被顯示的呼叫,而是在對錶增刪改操作後被啟用。所以可以用觸發器對來實施複雜的完整性約束。after 觸發器和instead of 觸發器 sql server 2000 支援兩種型別的觸發器 after 觸發器和instead of 觸發器。其中after 觸發器即為...
mysql 觸發器 觸發器使用
1 了解什麼是觸發器?mysql 的觸發器和儲存過程一樣,都是嵌入到mysql的一段程式,觸發器 是由事件觸發某個動作,這些事件包括,插入 更新 刪除等語句。如果定義了觸發程式,觸發器就會觸發執行相應的操作。觸發器 trigger 是個特殊的儲存過程,不同的是,執行儲存過程要使用call語句來呼叫,...