觸發器:即當發生某一事件時,如果滿足給定條件,則執行相應的動作。
它的基本架構:
觸發器創建語法:
(1)
CREATETRIGGER trigger_name
ON table|view
FOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]
AS
Sql_statement[…n]
(2)
CREATETRIGGER trigger_name
ON table|view
FOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]
AS
IFUPDATE(column)
[{AND|OR}UPDATE(COLUMN)][…]
IF(COLUMNS_UPDATED())
Sql_statement[…n]
注:(不同數據庫支持不同的類型觸發器,有些還支持before類型觸發器,像SQL server 就不支持before觸發器)
2)after 觸發器(也叫“FOR”觸發器)則會在觸發 insert、update 或是delect 動作之
后執行。
觸發事件分為三類:UPDATE、DELETE和INSERT。
另外,定義觸發器時,系統都都會自動生成兩張表,我們是可以直接用的,如下:
如下是實例(都是親手實踐過的):
1.在表Student中建立刪除觸發器,實現表Student和表SC的級聯刪除,也就是只要刪除表Student 中的元組學號為s1,則表SC中SNO為s1的元組也要刪除;建立完觸發器后用企業管理器刪除Student中學號 為30的元組,看看表SC中SNO為30的選課記錄是否也一起刪除; create trigger t_std2 on student instead of delete as begin declare @id char(5) select @id=sno from deleted delete from sc where SNo =@id delete from student where SNo=@id end go delete from Student where SNo='00002'
/*2. 在表Course中增加一個職業規划選修課,為(005,職業規划,4,0014),在表SC中建立一個觸發器, 實現規定年齡24歲以上(包括24歲)的學生才能選修職業規划這門課程,如果年齡小於24歲,則輸出’ 年齡小於24,不能選修該門課程’,插入失敗,用SQL語句在SC表中分別插入(‘00001’,’005’,null)和 (‘00005’,’005’,null)看看結果;**/ create trigger t_sc on sc for insert as begin declare @id char(5) select @id=sno from inserted if((select cno from inserted)='005' and (select sage from student where SNo= @id )<24) begin print '年齡小於24,不能選修該門課程 ' rollback transaction end else print 'nice!' end insert into course values('005','職業規划','4','0014') insert into sc values('00001','005',null) insert into sc values('00005','005',null) select * from sc go
3.在表SC中建立更改觸發器,實現表SC中的修改后的成績不能低於修改前的成績, 如果修改后的成績低於修改前的成績,則輸出’修改后的成績比修改前低,不能修改’, 修改失敗,用SQL語句把學號為00001,課程號為001的成績分別改為90和70,看看結果;
createtrigger t2_sc on sc
after update
as
if(update(score))
begin
declare @score1 numeric(3,1),@score2numeric(3,1)
select @score1=score from inserted
select @score2=score from deleted
if(@score1>@score2 )
print 'nice! '
else
update sc
set sc.Score=@score2 from sc,deleted
where sc.SNo=deleted.SNo andsc.CNo=deleted.CNo
print '失敗'
end
update sc
setScore=70 where SNo='00001' and CNo='001'4. 在表Teacher中創建觸發器,實現如果更新了表Teacher中的年齡和工資, 則輸出’更新了年齡和工資’,如果更新了年齡沒有更新工資,則輸出’更新了年齡’, 如果更新了工資而沒有更新年齡,則輸出’更新了工資’,創建完后使用SQL語句把 tno為001的年齡加1,把tno為002的工資加1,把tno為003的年齡和工資都加1,看看結果;
create trigger t_teacher on teacher after update as begin declare @age int,@sal float select @age=age from deleted select @sal=sal from deleted if(@age <> (select age from inserted )and @sal <>(select sal from inserted)) print '更新了年齡和工資 ' else if(@age <> (select age from inserted )and @sal =(select sal from inserted)) print '更新了工資 ' else if(@age = (select age from inserted )and @sal <>(select sal from inserted)) print '更新了年齡 ' end update Teacher set age=age+1 where Tno='0001'**/ /**
5. 在不刪除觸發器的前提下,使3創建的觸發器無效; alter table teacher disable trigger t_teacher**/
/** 6. 創建一個名為tri_Delete_C的觸發器,要求首先判斷數據庫中是否已經存在名為tri_Delete_C的觸發器, 如果存在,首先刪除,再創建,觸發器要求刪除一門課程時候,首先判斷該課程有否有人選,如果有人選, 則不能刪除,並通過測試數據驗證該觸發器的執行情況。**/ if(exists (select * from sysobjects where xtype='tr' and name='tri_Delete_C')) begin drop trigger tri_Delete_C print '已刪除' end go create trigger tri_Delete_C on course for delete as begin if exists (select * from sc inner join deleted on sc.CNo=deleted.CNo) begin print '不能刪除' rollback transaction end end go alter table sc drop constraint FK__sc__CNo__08B54D69 delete course where CNo='001' alter table sc add constraint FK__sc__CNo__08B54D69 foreign key(cno) references course(cno)