資料庫觸發器與事務

2021-08-30 06:53:56 字數 1816 閱讀 1400

當對資料庫中的一張表進行操作且同時又要對與之相關的其他表的資料進行修改時,要如何操作呢?一種方法是寫出每乙個操作的sql語句,然後逐一執行。但是,如果碰到銀行轉賬這種業務,我們需要先從a帳戶扣錢,然後給b帳戶加錢。若a帳戶扣錢成功但是b帳戶加錢失敗,我們還得再多寫一條sql用以在失敗的時候再把a的錢給加上。這樣太麻煩而且需要我們在底層寫很多資料庫操作**,容易出錯也不安全。

此時就可以用觸發器與事務來處理,當對a帳戶進行修改時自動觸發執行對b帳戶的修改,並且當其中任何乙個操作失敗時,事務會自動回滾,取消之前所有的操作,這樣就無形的減少了不少**及安全隱患。

我所做的專案就有這樣的乙個需要:有乙個文章表和乙個文章類別表,文章類別表中有個字段用於儲存該類別下的文章數量。所以,增加或刪除一篇文章同時需要對類別表進行修改,只需要使用如下的**建立乙個觸發器即可。

create

trigger trig_article_ins–開始建立觸發器

on dbo.blog_article–指明要對哪個表建立

forinsert

–建立insert型別的觸發器

asbegin

transaction

–開始事務

declare @cateid int,@errorsum int

–宣告變數,分別用於儲存類別id和錯誤統計

set @errorsum = 0–錯誤統計初值為0

select @cateid=log_cateid from inserted–查到新插入的文章的類別id

set @errorsum=@errorsum+@@error–累計錯誤

update blog_category set cate_count=cate_count+1 where cate_id=@cateid–對相應的表進行更新

set @errorsum=@errorsum+@@error–累計錯誤

if @errorsum <> 0–若執行期間出現錯誤則回滾,否則提交事務

begin

print 『建立失敗,回滾事務!』

rollback

transaction

endelse

begin

print 『建立成功,提交事務!』

commit

transaction

endgo

create trigger trig_article_ins--開始建立觸發器on dbo.blog_article--指明要對哪個表建立for insert--建立insert型別的觸發器asbegin transaction--開始事務	declare @cateid int,@errorsum int--宣告變數,分別用於儲存類別id和錯誤統計	set @errorsum = 0--錯誤統計初值為0	select @cateid=log_cateid from inserted--查到新插入的文章的類別id	set @errorsum=@errorsum+@@error--累計錯誤	update blog_category set cate_count=cate_count+1 where cate_id=@cateid--對相應的表進行更新	set @errorsum=@errorsum+@@error--累計錯誤		if @errorsum <> 0--若執行期間出現錯誤則回滾,否則提交事務		begin			print '建立失敗,回滾事務!'			rollback transaction		end	else		begin			print '建立成功,提交事務!'			commit transaction		endgo

另外,使用這個還有另外乙個原因:好久沒有寫過這些東西了,該練練手了。所以,今天在編寫這個觸發器的時候還小查了一下幫助手冊。

事務與觸發器A

事務 具有統一性的過程。可以新增for update來限制併發更新。主要由commit和rollback組成,他們不可同時有序執行。觸發器 不允許有引數。對於表加上約束,審計表的資訊。資料操作源觸發器,它建立在表的基礎之上。行級觸發器 例如建立刪除觸發器 create or replace trig...

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...

資料庫觸發器

最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...