機房收費系統之觸發器

2021-09-07 10:41:27 字數 3765 閱讀 7251

首先我們看看觸發器是什麼?

觸發器,由於我先認識的儲存過程+事務。所以我在這裡把他稱為儲存過程的小兄弟,至於為什麼,由於他們真的非常像,對於儲存過程,大家能夠在了解,這裡就不具體的介紹了。可是觸發器是什麼呢?

觸發器是sql server提供給程式猿和資料分析員來保證資料完整性的一種方式,它就是與表事件相關的特殊儲存過程。

觸發器不能被直接執行,僅僅能為表上的insert\update\delete事件所觸發。它也不能傳遞或接受引數。

觸發器能夠查詢其它表,並且能夠包括複雜的sql語句。它們主要用於強**從複雜的業務規則或要求。比如:您能夠依據客戶當前的帳戶狀態,控制是否同意插入新訂單。

比方說。我這裡有兩張表,一張是充值表(recharge_info)。一張是學生表(student_info)。假設我們要進行充值行為,也就是要進行兩個動作,第一為學生表的錢加上充值的錢,第二就是為充值表裡邊加入一條記錄,那麼假設要完畢這個操作,我們須要兩步,更新和插入資訊,也就說我們會這樣

insert recharge_info into (cardid,addmoney...) values(@cardid,addmoney...)

update student_info set cash=cash+addmoney where cardid=@cardid 

這個過程假設須要執行多次呢,大家每次都要用兩條語句來組合這乙個過程,是不是麻煩了點,於是如今就有了觸發器這個過程,那麼我來為大家來展示一下觸發器的同樣實現。

create trigger [dbo].[tr_charge_u]--建立觸發器

on [dbo].[t_recharge]--在t_recharge表

for insert為了插入資料而須要執行的操作

as --定義一些引數

declare @cardid char(10)--卡號

declare @cash decimal(10, 2)--卡內剩餘金額

declare @addmoney decimal(10, 2)--充值金額

if update(cash)

begin

select @cardid =cardid from inserted --選擇充值表中的卡號

select @addmoney=cash from inserted --選擇我們充值表中的充值金額

select @cash =t_card.cash from t_card --選擇卡內的剩餘金額

update t_card set cash=@cash+@addmoney where cardid =@cardid

end

這裡我們大家解釋一下。這個流程是怎麼回事,首先我們要執行的語句就是insert recharge_info into (cardid,addmoney...) values(@cardid,addmoney...),那麼觸發器當你在插入資料的時候,就會將資訊儲存到inserted中,然後我們再依據須要把裡邊的資料取出來。用來更新我們須要更新的表。

在觸發器中,我們有兩張表。一張是deleted表。一張inserted表。這兩張是虛擬表,用用完之後資料庫會自己主動刪除。

以下我用**的形式將他們的用處展現出來

對錶的操作

inserted邏輯表

deleted邏輯表

新增記錄(insert)

存放新增的記錄 無

刪除記錄(delete) 無

存放被刪除的記錄

改動記錄(update)

存放更新後的記錄

存放更新前的記錄

所以我們在執行操作的時候,人們會說觸發器是同一時候操作的。事實上不是的,觸發器把我們前邊說的insert recharge_info into (cardid,addmoney...) values(@cardid,addmoney...。update student_info set cash=cash+addmoney where cardid=@cardid 自己把邏輯問題給結局了,從而省的我們再寫兩僅僅三條語句去組合,用一次還好。那麼用多次呢?

但是觸發器也不是越多越好,由於他是體如今資料庫中的一段**,不會呈如今程式中,所以這在開發的階段加幾個或許不是問題。但是假設要是以後咱們的系統出現故障了。那麼要改動這方面就顯得有點難了,觸發器越是多越是會造成邏輯上的困難,所以建議大家用能夠,適當的用。

最後為大家獻上建立各種觸發器的一些小demo

insert觸發器

create

trigger tgr_classes_insert

on classes

for insert --插入觸發

as --定義變數

declare @id int, @name varchar(20), @temp int;

--在inserted表中查詢已經插入記錄資訊

select @id = id, @name = name from inserted;

set @name = @name + convert(varchar, @id);

set @temp = @id / 2;

insert into student values(@name, 18 + @id, @temp, @id);

delete觸發器

create

trigger tgr_classes_delete

on classes

fordelete --刪除觸發

asprint

'備份資料中……';

if (object_id('classesbackup', 'u') is

notnull)

--存在classesbackup,直接插入資料

insert into classesbackup select name, createdate from deleted;

else

--不存在classesbackup建立再插入

select * into classesbackup from deleted;

print

'備份資料成功!

;

update觸發器

create

trigger tgr_classes_update

on classes

forupdate

asdeclare @oldname varchar(20), @newname varchar(20);

--更新前的資料

select @oldname = name from deleted;

if (exists (select * from student where name like

'%'+ @oldname + '%'))

begin

--更新後的資料

select @newname = name from inserted;

update student set name = replace(name, @oldname, @newname) where name like

'%'+ @oldname + '%';

print

'級聯改動資料成功!

;

endelse

print

'無需改動student表!

; 乙個觸發器,乙個儲存過程。乙個全自己主動。乙個隨意呼叫,都能讓程式執行的更快,占用的資源更少。雖然看上去也非常像。功能貌似給我們降低了非常多的壓力,可是在寫的時候。或者說是在設計資料庫的時候,我們還是要慎重的用,否者我們會給軟體以後的執行帶來難以想象的痛苦。

機房收費系統之觸發器的使用

不過這次敲個人版機房收費系統,自己實際去運用了一下觸發器,感覺它太給力了,節省了很多不必要的 了,減輕了系統的負擔。還節省了很多時間。真是既省時又省力。廢話不多說了,接下來在簡單嘮叨幾句什麼是觸發器,觸發器的好處以及注意事項和自己在機房時所用的觸發器例項。觸發器 trigger 是sql serve...

機房收費系統之結尾

機房收費系統在這個冬月告乙個不完美的結局,剛開始接觸他的時候,各種糾結,各種逃避,各種不想做,接觸乙個新的事物,內心充滿了恐懼與排斥,機房收費系統與學生管理系統不一樣,沒有原始碼,這個時候,需要自己不斷的給予自己鼓勵,七 期的師哥師姐都做出來了,你完全有理由相信,自己也能做出來。機房收費系統來來回回...

機房收費系統之思路

機房收費系統的資料放在手裡已經有好一段時間了,卻遲遲沒有開始動工。不知道是對它產生的牴觸心理,還是自己本身就好懶。總是放著不肯前進。但是這幾天看到同學們的進度都好快,有的甚至都已經結束了。不能再偷懶了,話說進度不用太趕,但是自己心裡還是很著急的。畢竟大家的起跑點都是一樣的,怎麼能夠在半路落在別人身後...