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 動作之
後執行。
觸發事件分為三類: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 [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 Statistics(P55~P58)、Statistics and Execution Plans
每次你改變聚簇索引鍵的值時,都會發生兩件事。 首先,SQL Server將行移動到聚簇索引頁鏈和資料檔案中的不同位置。 其次,它更新聚集索引鍵,行編號。 行編號被儲存起來而且要在所有非聚簇索引中更新。 對於I / O而言,這花銷可能很昂貴,尤其是在批處理更新的情況下。此外,它可以增加聚簇索引的碎片,並且在行編
SQL Server 2005(64 位)系統要求
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 2017(vNext)的第三個公開的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:在圖書的新增/修改