1. 程式人生 > >SQL SERVER觸發器(附有例項)

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。

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

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

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 
[email protected]
delete from student where [email protected] 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 [email protected] 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) 




相關推薦

SQL SERVER觸發器附有例項

觸發器:即當發生某一事件時,如果滿足給定條件,則執行相應的動作。它的基本架構:  觸發器建立語法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|

sql中關於T-sql遊標的使用附有例項

select *from Student order by SName for read only open s_sur select @@CURSOR_ROWS fetch next from s_sur update Student set SAge ='50' where current of s_su

【Mysql】trigger觸發器一些例項

簡述 搞這個,主要是因為在網上根本沒找到mysql在這方面的太多資料。 所以,自己搞個筆記。 立個flag,如果遇到,或者試出來什麼比較好用的trigger的操作。就過來這個存起來 文章目錄 簡述 建立 不滿足條件就不修

《Pro SQL Server Internals, 2nd edition》pdf已傳至群檔案的CHAPTER 3 Statistics中的Introduction to SQL Server StatisticsP55~P58、Statistics and Execution Plans

每次你改變聚簇索引鍵的值時,都會發生兩件事。 首先,SQL Server將行移動到聚簇索引頁鏈和資料檔案中的不同位置。 其次,它更新聚集索引鍵,行編號。 行編號被儲存起來而且要在所有非聚簇索引中更新。 對於I / O而言,這花銷可能很昂貴,尤其是在批處理更新的情況下。此外,它可以增加聚簇索引的碎片,並且在行編

SQL Server 200564 位系統要求

Windows 95、Windows 98、Windows Me、Windows NT 4.0、Windows 2000 和 Windows XP 具有內建網路軟體。如果使用 Banyan VINES 或 AppleTalk ADSP,則需要安裝其他網路軟體。由基於 Windows 的聯網 NWLink 協議

還原sql server 資料庫.bak檔案

在SQL2008中用備份*.bak檔案恢復資料庫  1.右擊SQL Server 2000例項下的“資料庫”資料夾。就是master等資料庫上一級的那個圖示。選擇“所有任務”,“還原資料庫”  2.在“還原為資料庫”中填上你希望恢復的資料庫名字。這個名字應該與你的原始碼中使用的資料庫名字一致。  3.在彈

SQL server觸發器例項講解如何實現兩個表的關聯

SQL觸發器例項1 定義: 何為觸發器?在SQL Server裡面也就是對某一個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是一個特殊的儲存過程。 常見的觸發器有三種:分別應用於Insert , Update , Delete 事件。 我為什麼要使用觸發器?比如,這麼兩個表: Create

執行登入觸發器sql server 2016限制IP訪問後,登入sql server報錯: 由於執行觸發器,登入失敗已將資料庫上下文更改為master。解決方法:用cmd執行刪除登入觸發器

背景: 在cmd中執行osql命令: osql -S 【資料庫伺服器】 -E  -i  mysql.sql 其中mysql.sql內容如下: CREATE LOGIN test WITH PASSWORD = '輸入密碼' GO

SQL SERVER觸發器應用案例講解deleted表或者inserted表

1、觸發器觸發時:    a、系統自動在記憶體中建立deleted表或者inserted表   b、只讀,不允許修改;觸發器執行完成後,自動刪除 2、inserted表 a、臨時儲存了插入或更新後的記錄行 b、可以從inserted表中檢查插入的資料是否滿足業務需求 c、

【菜鳥系列】SQL Server跨伺服器例項訪問資料庫

/*** 竟然又一次來寫部落格了~是經理建議我堅持寫部落格的~看了3個月前我的第一篇部落格,也覺得很有必要 囉嗦幾句~ 一眨眼3個月過去了~本人有沒有變得NB一點了呢? 完全沒有!!!而且還變的更菜了~現在看自己寫的部落格已經有點看不懂了~真是太不幸了~ 最近單位做了一款

消息:SQL Server 2017vNext的第三個公開的CTP社區技術預覽版發布了

start spn system 看到了 一個 get creat 社區 目前 今天看到了一個新聞,跟大家分享一下,有興趣的可以去嘗試一下。 SQL Server 2017 CTP3於5月23日發布了,詳細版本號是6.7.55.0。 大家可以去安裝試試。在下載頁面,目前是S

轉:SQL SERVER 2014 安裝圖解SQL SERVER 2014 安裝程序共享

baidu ref 密碼 步驟 ase share 配置 實例 try 開篇介紹 2015年1月1日,新的一年開始之際,本來應該好好做點有意義的事情來跨個年的。結果,老習慣 - 睡覺之前一定要折騰一下電腦,說幹就幹,給新到的 DELL 電腦裝虛機,下載 SQL SERV

SQL server學習——T-SQL編程之存儲過程

mds ren creat 存儲 創建數據庫 希望 with 接收 bank 周五了,祝大家周末愉快。 之前一直在寫SQL server的分享,今天再來個T-SQL編程中的存儲過程。 存儲過程 存儲過程(procedure)類似於C語言中的函數,用來執行管理任務或應用復雜的

卸載SQL Server 2008 R2

span SQ microsoft see config文件 ron sql https mac 一、卸載SQL Server 2008 (R2)   1、找到控制面板,win8及win7都可以直接點解“開始”按鈕找到。 (Tip:win10系統

sql server 操作不定期更新

要求:基本的語法要清楚。 sql server疑難點:  1、Partition by可以理解為 對多行資料分組後排序取每個產品的第一行資料 先處理內查詢,由內向外處理,外層查詢利用內層查詢的結果巢狀查詢不僅僅可以用於父查詢select語句使用。還可以用於insert、update、delet

mybatis學習筆記之——連線SQL server資料庫IDEA

我們新建一個普通的專案,File --> New --> Project -->Java --> Java EE。然後新建專案即可。 專案完成後我們新建一個conf資料夾,用來存放配置資訊,新建一個lib資料夾,用來存放jar包。 我們將mybatis的jar包,連線

SQL SERVER 索引3——聚集索引

      一、概念        前邊我們介紹過,索引是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。  聚集索引基於資料行的鍵值在表內排序和儲存這些資料行,對磁碟上實際資料重新組織以按指定的一列或

SQL SERVER 索引2——設計原則

       索引有助於我們提高系統的效能,提升查詢效率,但是如果索引設計的不夠合理,可能會適得其反,讓我們的系統更加緩慢,查詢效率下降,所以本次介紹一下索引的設計原則。        資料表的選擇:  

SQL SERVER 索引1——簡介

       索引是什麼,索引是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。 索引包含由表或檢視中的一列或多列生成的鍵。 這些鍵儲存在一個結構(B 樹)中,使 SQL Server 可以快速有效地查詢與鍵值關聯的行。簡單說索引就是一個目錄,是

Struts2 框架 +SQL Server資料庫 圖書的增刪改查

用資料庫和struts2框架來實現簡單的圖書的管理(增刪改查) 要求:      1:登入成功之後跳轉到一個新增的頁面 圖書列表頁面     2:增加圖書的新增頁面及功能     3:增加圖書的刪除功能     4:增加圖書的修改頁面及功能     5:在圖書的新增/修改