觸發器

--1.什麼是觸發器 --觸發器是在對錶進行插入、更新或刪除操做時自動執行的存儲過程 --觸發器一般用於強制業務規則 --觸發器是一種高級約束,能夠定義比用CHECK 約束更爲複雜的約束  --觸發器定義在特定的表上,與表相關 --自動觸發執行 --不能直接調用 --是一個事務(可回滾) --2.觸發器的類型 --DELETE 觸發器 INSERT 觸發器 UPDATE 觸發器

--3.建立觸發器 --CREATE TRIGGER trigger_name -- ON table_name -- FOR [DELETE, INSERT, UPDATE] -- AS  -- T-SQL語句 --GO

create table transinfo ( cardId varchar(7), transType varchar(4), transMoney decimal(18,2) ) --3.1解決上述的銀行取款問題:當向交易信息表(transInfo)中插入一條交易信息時 --咱們應自動更新對應賬戶的餘額。 
create trigger trig_transInfo on transinfo for insert--insert觸發器,系統自動生成inserted表
as
--inserted表中臨時保存了被插入或被更新後的記錄行
declare @cardid varchar(7) declare @transType varchar(4) declare @transMoney decimal(18,2) --select * from inserted:理解inserted表
select @cardid=cardId,@transType=transType, @transMoney=transMoney from inserted if @transType='支取'
    update bank set currentMoney=currentMoney-@transMoney
     where cardid=@cardid
else
    update bank set currentMoney=currentMoney+@transMoney
     where cardid=@cardid
go

--當向transinfo表中插入數據時,觸發trig_transinfo觸發器
insert transinfo values('1001101','存款',200) --3.2當刪除交易信息表時,要求自動備份被刪除的數據到表backupTable中 
create trigger trig_delete_transinfo on transinfo for delete --delete觸發器只會生deleted表
as
if exists(select * from sysobjects where name='backupTable') begin
    print '備份到已存在的backupTable表中'
    insert into backupTable select * from deleted end
else
  begin
    print '備份到不存在的backupTable表中'
    select * into backupTable from deleted end
go

--當刪除transinfo表中的數據時,觸發trig_delete_transinfo觸發器
delete from transinfo --3.3跟蹤用戶的交易,交易金額超過20000元, --則取消交易,並給出錯誤提示。 
alter trigger trig_update_bank on bank for update--update觸發器,系統自動成inserted,deleted表
as
declare @bMoney decimal(18,2) declare @aMoney decimal(18,2) select @bMoney=currentMoney from deleted select @aMoney=currentMOney from inserted if abs(@aMoney-@bMoney)>20000
   begin
     print '交易額不能超過20000'
     rollback tran
   end
else
   begin
     print '交易成功'
   end
go

--當向transinfo表中插入數據時,觸發trig_transinfo觸發器 --trig_transinfo觸發器中修改bank表數據,再次觸發trig_update_bank觸發器
insert transinfo values('1001101','存款',1000) --觸發器觸發時: --系統自動在內存中建立deleted表或inserted表 --只讀,不容許修改;觸發器執行完成後,自動刪除 --inserted 表  --用於存儲 INSERT 和 UPDATE 語句所影響的行的副本,即在inserted 表中臨時保存了被插入或被更新後的記錄行。在執行INSERT 或 UPDATE 語句時,新加行被同時添加到 inserted 表和觸發器表中。由此咱們能夠從inserted檢查插入的數據是否知足業務需求。若是不知足,就能夠向用戶報告錯誤消息,並回滾撤銷操做。  --deleted 表 --用於存儲 DELETE 和 UPDATE 語句所影響的行的副本,即在deleted表中臨時保存了被刪除或被更新前的記錄行。在執行 DELETE 或 UPDATE 語句時,行從觸發器表中刪除,並傳輸到 deleted 表中。由此咱們能夠從deleted 表中檢查刪除的數據行是否能刪除。若是不能,就能夠回滾撤銷此操做,由於觸發器自己就是一個特殊的事務單元。
相關文章
相關標籤/搜索