SQL Server觸發器的基本語法與作用


什么是觸發器?

  • 觸發器是在對表進行插入、更新或刪除操作時自動執行的存儲過程
  • 觸發器通常用於強制業務規則
  • 觸發器是一種高級約束,可以定義比用CHECK 約束更為復雜的約束 :可執行復雜的SQL語句(if/while/case)、可引用其它表中的列
  • 觸發器定義在特定的表上,與表相關。
  •  自動觸發執行
  •  不能直接調用
  •  是一個事務(可回滾)

使用觸發器的好處

觸發器可通過數據庫中的相關表實現級聯更改,不過,通過級聯引用完整性約束可以更有效地執行這些更改。

觸發器可以強制比用CHECK約束定義的約束更為復雜的約束。與 CHECK 約束不同,觸發器可以引用

其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,

如修改數據或顯示用戶定義錯誤信息。觸發器也可以評估數據修改前后的表狀態,並根據其差異采取對策。

一個表中的多個同類觸發器(INSERT、UPDATE 或 DELETE)允許采取多個不同的對策以響應同一個修改語句。

觸發器的類型

  • *DELETE 觸發器
  • INSERT 觸發器
  • UPDATE 觸發器

創建觸發的語法

 

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR [DELETE, INSERT, UPDATE]
 AS 
  T-SQL語句
GO

注意:WITH ENCRYPTION表示加密觸發器定義的SQL文本 DELETE, INSERT, UPDATE指定觸發器的類型

insert 觸發器示例

/*創建insert觸發器,在上網記錄表recordInfo上創建插入觸發器*/
create trigger tr_insert_recordInfo
on recordInfo
for insert
 as
/*定義變量,用於臨時存儲插入的會員號、電腦編號和卡的編號*/
declare @cardId char(10)
declare @PCId int
declare @CardNumber char(10)
/*從inserted臨時表中獲取插入的記錄行的信息,包括電腦的編號、卡的編號*/
select @PCId=PCId,@cardId=CardId from inserted
/*根據電腦編號修改電腦的使用狀態*/
update PCInfo set PCUse=1 where PCId=@PCId
/*根據卡的編號查詢會員號*/
select @CardNumber=CardNumber from cardinfo where CardId=@cardid
/*顯示上機成功的信息*/
print '上機成功!會員號是:'+@CardNumber+'機器號是:'+convert(char(10),@PCId)
go
----插入測試數據,會員號為的上機
set nocount on      --不顯示sql語句影響的記錄行數
declare @CardId int   ---聲明一個存儲卡的編號的變量
---根據會員號查處卡的編號
select @cardId=cardid from cardinfo where cardNumber='c001'  
---向recordInfo表中插入一條記錄信息,卡的編號、電腦編號和上機時間
 insert into recordInfo(cardId,PCId,beginTime) values(@cardId,1,getDate())
----查看結果
select * from recordInfo
select * from PCInfo

update觸發器示例

---創建delete觸發器,在上網記錄表RecordInfo上創建刪除觸發器
create  trigger tr_delete_recordInfo
on recordInfo
for delete
as

if exists(select * from sysobjects where name='backRecordInfo')
  ----如果backrecordInfo表存在,就添加記錄即可
  insert into backRecordInfo select * from deleted
else
  ----創建backRecordInfo表,從deleted中獲取被刪除的數據
  select * into backRecordInfo from deleted
print'backRecordInfo表備份數據成功,備份表中的數據為:'
   select * from backRecordInfo
go
-------關鍵代碼------
----測試delete觸發器,刪除數據
set nocount on
delete from recordInfo
---查看結果
print'記錄表中的數據為:'
select * from recordInfo

elete觸發器示例

-------關鍵代碼------
create trigger tr_update_recordInfo
on recordInfo
for update
as
declare @beforePCId int
declare @afterPCId int
select @beforePCId =PCId from deleted
select @afterPCId=PCID from inserted
---根據電腦編號修改使用狀態-----
---根據以前使用的電腦編號把電腦的使用狀態改為:
 update PCInfo set PCUse=0 where PCId=@beforePCId
---根據現在使用的電腦編號把電腦的使用狀態改為:
 update PCInfo set PCUse=1 where PCId=@afterPCId
----顯示電腦換機成功
print'換機成功!從'+convert(varchar(10),@beforePCId)+'號電腦換到'+convert(varchar(10),@afterPCId)+'號電腦'
go
/*測試update觸發器,修改電腦編號*/
--顯示更改前,記錄表中的數據
print'更改前,記錄表中的數據'
select * from recordInfo

--顯示更改前,電腦表中的數據
print'更改前,電腦表中的數據'
select * from PCInfo

set nocount on
---把電腦號為1的改為2
update recordInfo set PCId=2 where PCId=1  
---查看結果
print'更改后,記錄表中的數據'
select * from recordInfo
print'更改后,電腦表中的數據'
select * from PCInfo

instead of觸發器的使用

* instead of觸發器的使用范圍,instead of 觸發器可以同時在數據表和視圖中使用。通常在以下幾種情況下,建議使用instead of觸發器:
*數據庫里的數據禁止修改:例如電信部門的通話記錄是不能修改的,一旦修改,則通話費用的計數將不准確。
*有可能要回滾修改的SQL語句
*在視圖中使用觸發器
*用自己的方式去修改數據

instead of觸發器示例

---創建update觸發器,在上網記錄表recordInfo上創建修改(列)觸發器
create trigger tr_updateColum1_recordInfo
on recordInfo
instead of insert
as
 declare @cardbalance int  --聲明用於存儲用戶余額的變量
 declare @CardId int       --聲明用於存儲用戶卡的編號的變量
 declare @PCId int         --聲明用於存儲電腦編號的變量
---inserted臨時表中獲取插入的記錄行信息,包括電腦編號、卡的編號
select @cardId=cardId,@PCId=PCId from inserted
select @cardbalance=cardBalance from cardInfo where CardId=@CardId
print'您的余額為:'+convert(varchar(10),@cardBalance) ---打印余額信息
if(@cardBalance<2)    ---判斷余額多少,看能否正常上機
print'余額小於元,不能上機。請盡快充值!'
else
----根據電腦的編號修改電腦的使用狀態更改為正在使用
  update PCInfo set PCUse=1 where PCId=@PCId
----向recordInfo表插入上機記錄
insert into recordInfo(cardId,PCId,beginTime)values(@CardId,@PCId,getdate())
 print'上機成功'
-------關鍵代碼------
set nocount on
declare @cardId int  ---聲明一個存儲卡的編號的變量
---根據會員號查出卡的編號
select @cardId=cardId from cardInfo where cardNumber='c001'
----向recordInfo表中插入一條記錄信息,卡的編號、電腦的編號和上機時間
insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())
select * from recordInfo
select * from PCInfo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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