SQL SERVER觸發器(附有實例)


觸發器即當發生某一事件時,如果滿足給定條件,則執行相應的動作。

它的基本架構:

  

觸發器創建語法:

(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觸發器)


SQL Server 支持兩種類型的觸發器AFTER 觸發器和INSTEAD OF 觸發器,其中、

AFTER 觸發器要求只有執行某一操作 ISERT, UPDATE ,DELETE   之后觸發器才被觸

發。

1)INSTEAD OF 觸發器表示並不執行其所定義的操作 INSERT,UPDATE ,DELETE ,而

僅是 執行觸發器本身,既可在表上定義 INSTEAD OF 觸發器,也可以在視圖上定

INSTEAD OF 觸發器。

2)after  觸發器(也叫“FOR”觸發器)則會在觸發 insert、update 或是delect 動作之

后執行。


觸發事件分為三類:UPDATEDELETEINSERT。


另外,定義觸發器時,系統都都會自動生成兩張表,我們是可以直接用的,如下:


如下是實例(都是親手實踐過的):

可在這里下載數據庫文件,下面實例以這個數據庫為例子

我想改為0的但改不了,小伙伴可以參照便文章免費下載

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) 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM