色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

SQL Server數(shù)據(jù)庫開發(fā)之觸發(fā)器的實(shí)際應(yīng)用

瀏覽:2日期:2023-11-05 18:55:40

說明:由于個人能力有限,文章中難免會出現(xiàn)錯誤或遺漏的地方,敬請諒解!同時(shí)歡迎你指出,以便我能及時(shí)修改,以免誤導(dǎo)下一個看官。最后希望本文能給你帶來一定的幫助。

不知道在壇子里有多少朋友使用觸發(fā)器,如果你已經(jīng)對觸發(fā)器很了解了,那么請?zhí)^此文,如果你還沒有使用過觸發(fā)器的話,那就讓我們來認(rèn)識一下吧。

QUOTE:

定義:

觸發(fā)器是一種特殊類型的存儲過程,不由用戶直接調(diào)用。當(dāng)使用下面的一種或多種數(shù)據(jù)修改操作在指定表中對數(shù)據(jù)進(jìn)行修改時(shí),觸發(fā)器會生效:UPDATE、INSERT 或 DELETE。觸發(fā)器可以查詢其它表,而且可以包含復(fù)雜的 SQL 語句。它們主要用于強(qiáng)制復(fù)雜的業(yè)務(wù)規(guī)則或要求。

觸發(fā)器一個應(yīng)用就是保持和維護(hù)數(shù)據(jù)的完整性及合法性,那么怎么來理解呢?就是說你可以在程序里提交任意數(shù)據(jù),然后由觸發(fā)器來判斷數(shù)據(jù)的完整性及合法性,當(dāng)然這里只是舉例說明,實(shí)際應(yīng)用中不推薦這樣用,應(yīng)該由應(yīng)用程序來驗(yàn)證數(shù)據(jù)的完整性及合法性。

下面我還是以實(shí)例的方式來描述觸發(fā)器的應(yīng)用。

假設(shè):當(dāng)前數(shù)據(jù)庫中有“uMateriel”和“uRecord”兩張表,他們分別用來保存物品信息和物品的出入庫記錄信息,結(jié)構(gòu)如下

QUOTE:uMateriel

----------------

mId int

mNamenvarchar(40)

mNum int DEFAULT 0

uRecord

----------------

rId int

mId int

rNum int

rDatedatetime DEFAULT GetDate()

rModebit DEFAULT 0

好了,數(shù)據(jù)表已經(jīng)有了,現(xiàn)在看一下實(shí)際的應(yīng)用。

現(xiàn)在,我們要購入物品A,數(shù)量100,時(shí)間為當(dāng)天,已知物品A的編號為1,那么通常我們需要做以下兩個步驟:

QUOTE:1、在 uRecord 記錄表中增加一條物品A的購入記錄:

INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)

更新 uMateriel 物品庫存表中物品A的數(shù)量:

UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1

也就是說代碼中要先后處理以上兩條語句,才能保證庫存的準(zhǔn)確性,以ASP代碼為例:

QUOTE:On Error Resume Next

'// 設(shè) adoConn 為已經(jīng)連接的 ADODB.Connection 對象

With adoConn

'// 事務(wù)開始,因?yàn)樯婕暗蕉嗖綌?shù)據(jù)更新操作,所以在這里使用事務(wù)

.BeginTrans

'// 插入物品入庫記錄

.Execute('INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)')

'// 更新物品庫存記錄

.Execute('UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1')

'// 判斷是否產(chǎn)生了錯誤

If Err.Number <> 0 Then

'// 如果有錯誤,事務(wù)回滾

.RollbackTrans

Response.Write '錯誤!'

Err.Clear

Else

'// 如果沒有錯誤,則提交事務(wù)

.CommitTrans

End If

End With

以上代碼可以更新一條入庫記錄了,但是我們今天要了解的是觸發(fā)器的應(yīng)用,那么要在觸發(fā)器里寫什么內(nèi)容可以簡化以上代碼呢?下面來創(chuàng)建一個觸發(fā)器。

創(chuàng)建觸發(fā)器的語法很長,簡化為:

QUOTE:CREATE TRIGGER 觸發(fā)器名 ON 表名/視圖名

{ FOR | AFTER | INSTEAD OF } { [DELETE] [,] [INSERT] [,] [UPDATE] }

AS

觸發(fā)器內(nèi)容(SQL 語句)

QUOTE:SQL SERVER 聯(lián)機(jī)叢書的描述:

AFTER

指定觸發(fā)器只有在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。

如果僅指定 FOR 關(guān)鍵字,則 AFTER 是默認(rèn)設(shè)置。

不能在視圖上定義 AFTER 觸發(fā)器。

INSTEAD OF

指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā) SQL 語句,從而替代觸發(fā)語句的操作。

在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發(fā)器。然而,可以在每個具有 INSTEAD OF 觸發(fā)器的視圖上定義視圖。

INSTEAD OF 觸發(fā)器不能在 WITH CHECK OPTION 的可更新視圖上定義。如果向指定了 WITH CHECK OPTION 選項(xiàng)的可更新視圖添加 INSTEAD OF 觸發(fā)器,SQL Server 將產(chǎn)生一個錯誤。用戶必須用 ALTER VIEW 刪除該選項(xiàng)后才能定義 INSTEAD OF 觸發(fā)器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

是指定在表或視圖上執(zhí)行哪些數(shù)據(jù)修改語句時(shí)將激活觸發(fā)器的關(guān)鍵字。必須至少指定一個選項(xiàng)。在觸發(fā)器定義中允許使用以任意順序組合的這些關(guān)鍵字。如果指定的選項(xiàng)多于一個,需用逗號分隔這些選項(xiàng)。

對于 INSTEAD OF 觸發(fā)器,不允許在具有 ON DELETE 級聯(lián)操作引用關(guān)系的表上使用 DELETE 選項(xiàng)。同樣,也不允許在具有 ON UPDATE 級聯(lián)操作引用關(guān)系的表上使用 UPDATE 選項(xiàng)。

現(xiàn)在根據(jù)上面的語法我們建立一個觸發(fā)器(注意一點(diǎn),觸發(fā)器是附于一張表或視圖的,所以只能在表里建立或在查詢分析器里建立),這個觸發(fā)器的功能就是自動更新庫存數(shù)量

QUOTE:CREATE TRIGGER [trUpdateMaterielNum] ON [dbo].[uRecord]

-- 表明在插入記錄之后執(zhí)行這個觸發(fā)器

AFTER INSERT

AS

-- 當(dāng)前更新的編號

DECLARE @intID int

-- 當(dāng)前更新的數(shù)量

DECLARE @intNum int

-- 當(dāng)前模式

DECLARE @intMode int

-- 判斷是否有記錄錄被更新,@@ROWCOUNT是系統(tǒng)函數(shù),返回受上一語句影響的行數(shù)。

IF @@ROWCOUNT >0

BEGIN

-- 取得當(dāng)前插入的物品編號和數(shù)量,Inserted 表用于存儲 INSERT 和 UPDATE 語句所影響的行的副本。

SELECT @intID=mId,@intNum=rNum,@intMode=rMode FROM Inserted

-- 判斷當(dāng)前模式(0為入庫,1為出庫)來更新當(dāng)前物品的數(shù)量

IF @intMode = 0

UPDATE uMateriel SET mNum = mNum + @intNum WHERE mId=@intID

ELSE

UPDATE uMateriel SET mNum = mNum - @intNum WHERE mId=@intID

END

我們現(xiàn)在來了解一下這個觸發(fā)器,首先使用 CREATE TRIGGER 語句定義一個基于 uRecord 表的觸發(fā)器 trUpdateMaterielNum,AFTER INSERT 表明這個觸發(fā)器會在插入記錄之后執(zhí)行,也就是說當(dāng)我們在程序里執(zhí)行 INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0) 這條語句之后,trUpdateMaterielNum這個觸發(fā)器里的內(nèi)容就會被自動執(zhí)行,也就是說庫存將會被自動更新了。現(xiàn)在我們更改一下ASP的代碼

QUOTE:On Error Resume Next

'// 設(shè) adoConn 為已經(jīng)連接的 ADODB.Connection 對象

'// 插入物品入庫記錄

adoConn.Execute('INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)')

'// 判斷是否產(chǎn)生了錯誤

If Err.Number <> 0 Then

Response.Write '錯誤!'

Err.Clear

End If

是不是簡化了很多呢,是的,在這里已經(jīng)不用考慮庫存方面,只需要插入流水帳就可以了,庫存更新就交由觸發(fā)器來處理。

以上的例子是觸發(fā)器的其中一個應(yīng)用,在觸發(fā)器的參數(shù)中還有 DELETE、UPDATE,他們分別在刪除和更新時(shí)或之后執(zhí)行。下面看一個刪除時(shí)的觸發(fā)器例子。

我們在數(shù)據(jù)庫中增加一個表,用來記錄日志,其結(jié)構(gòu)如下:

QUOTE:uSysLog

--------------

lId int

lEvent nvarchar(200)

lTime datetime DEFAULT GetDate()

現(xiàn)在假設(shè)這張表是用來記錄系統(tǒng)的日志用的,當(dāng)我們刪除一條流水帳時(shí),往日志表里記錄一條事件,那么我們來創(chuàng)建一個基于 uRecord 表的刪除時(shí)的觸發(fā)器

QUOTE:CREATE TRIGGER [trDeleteRecord] ON [dbo].[uRecord]

-- 表明在插入記錄之后執(zhí)行這個觸發(fā)器

FOR DELETE

AS

-- 當(dāng)前刪除的流水號

DECLARE @intID int

-- 當(dāng)前刪除的數(shù)量

DECLARE @intNum int

-- 當(dāng)前模式

DECLARE @intMode int

-- 判斷是否有記錄錄被更新,@@ROWCOUNT是系統(tǒng)函數(shù),返回受上一語句影響的行數(shù)。

IF @@ROWCOUNT >0

BEGIN

-- 取得當(dāng)前刪除的行信息,Deleted 表用于存儲 DELETE 和 UPDATE 語句所影響的行的復(fù)本。

SELECT @intID=rId,@intNum=rNum,@intMode=rMode FROM Deleted

-- 向日志表中插入一條簡單的刪除事件日志

INSERT INTO uSysLog (lEvent) VALUES ('用戶刪除了流水號為:' + CAST(@intID as nvarchar(20) + ',數(shù)量:' + CAST(@intNum as nvarchar(20) + ',方向:' + CASE @intMode WHEN 0 THEN '入庫' ELSE '出庫' END)

END

建立好觸發(fā)器后,現(xiàn)在只要我們刪除 uRecord 表中的一條記錄,就會在系統(tǒng)日志中增加一條事件日志。

通過以上簡單的介紹,希望原來沒有使用過觸發(fā)器的朋友能對觸發(fā)器有個大致的概念和印象,如果你要深入了解的話,SQL SERVER聯(lián)機(jī)叢書就是你的好幫手。那么觸發(fā)器的簡單應(yīng)用就介紹到這兒了,我們下次再會。

標(biāo)簽: Sql Server 數(shù)據(jù)庫
主站蜘蛛池模板: 亚洲国产精品综合久久久 | 久草在线播放视频 | 手机在线黄色网址 | 久久ri精品高清一区二区三区 | 欧美一级毛片图 | 91男女视频 | 成人观看免费大片在线观看 | 久久亚洲天堂 | 欧美日韩中文字幕在线观看 | 亚洲大片 | 欧美久久久久久久久 | 福利片成人午夜在线 | 免费一级a毛片免费观看欧美大片 | 中文字幕有码视频 | 国内自拍亚洲 | 成年人免费在线观看网站 | 成人满18在线观看网站免费 | 99在线播放视频 | 麻豆日韩| 91精品成人免费国产片 | 亚洲国产成人超福利久久精品 | 国产不卡一区二区三区免费视 | 午夜无遮挡怕怕怕免费视频 | 亚洲人的天堂男人爽爽爽 | 深夜一级毛片 | 成人久久18免费网站入口 | 国产手机看片 | 免费a级毛片网站 | 国产成人精品高清不卡在线 | 正在播放亚洲一区 | 欧美成人免费香蕉 | 国产午夜亚洲精品一区网站 | 久久毛片视频 | 国产在线精品一区二区中文 | 色怡红院| 久久黄色影片 | 亚洲一区二区三区高清网 | 亚洲黄色三级视频 | 国产成人艳妇在线观看 | 亚洲精品久久久久久久久久久网站 | 中文字幕在线视频网站 |