日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SQL Server數據庫開發之觸發器的實際應用

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

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

不知道在壇子里有多少朋友使用觸發器,如果你已經對觸發器很了解了,那么請跳過此文,如果你還沒有使用過觸發器的話,那就讓我們來認識一下吧。

QUOTE:

定義:

觸發器是一種特殊類型的存儲過程,不由用戶直接調用。當使用下面的一種或多種數據修改操作在指定表中對數據進行修改時,觸發器會生效:UPDATE、INSERT 或 DELETE。觸發器可以查詢其它表,而且可以包含復雜的 SQL 語句。它們主要用于強制復雜的業務規則或要求。

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

下面我還是以實例的方式來描述觸發器的應用。

假設:當前數據庫中有“uMateriel”和“uRecord”兩張表,他們分別用來保存物品信息和物品的出入庫記錄信息,結構如下

QUOTE:uMateriel

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

mId int

mNamenvarchar(40)

mNum int DEFAULT 0

uRecord

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

rId int

mId int

rNum int

rDatedatetime DEFAULT GetDate()

rModebit DEFAULT 0

好了,數據表已經有了,現在看一下實際的應用。

現在,我們要購入物品A,數量100,時間為當天,已知物品A的編號為1,那么通常我們需要做以下兩個步驟:

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

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

更新 uMateriel 物品庫存表中物品A的數量:

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

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

QUOTE:On Error Resume Next

'// 設 adoConn 為已經連接的 ADODB.Connection 對象

With adoConn

'// 事務開始,因為涉及到多步數據更新操作,所以在這里使用事務

.BeginTrans

'// 插入物品入庫記錄

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

'// 更新物品庫存記錄

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

'// 判斷是否產生了錯誤

If Err.Number <> 0 Then

'// 如果有錯誤,事務回滾

.RollbackTrans

Response.Write '錯誤!'

Err.Clear

Else

'// 如果沒有錯誤,則提交事務

.CommitTrans

End If

End With

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

創建觸發器的語法很長,簡化為:

QUOTE:CREATE TRIGGER 觸發器名 ON 表名/視圖名

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

AS

觸發器內容(SQL 語句)

QUOTE:SQL SERVER 聯機叢書的描述:

AFTER

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

如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。

不能在視圖上定義 AFTER 觸發器。

INSTEAD OF

指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。

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

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

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

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

對于 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。

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

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

-- 表明在插入記錄之后執行這個觸發器

AFTER INSERT

AS

-- 當前更新的編號

DECLARE @intID int

-- 當前更新的數量

DECLARE @intNum int

-- 當前模式

DECLARE @intMode int

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

IF @@ROWCOUNT >0

BEGIN

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

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

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

IF @intMode = 0

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

ELSE

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

END

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

QUOTE:On Error Resume Next

'// 設 adoConn 為已經連接的 ADODB.Connection 對象

'// 插入物品入庫記錄

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

'// 判斷是否產生了錯誤

If Err.Number <> 0 Then

Response.Write '錯誤!'

Err.Clear

End If

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

以上的例子是觸發器的其中一個應用,在觸發器的參數中還有 DELETE、UPDATE,他們分別在刪除和更新時或之后執行。下面看一個刪除時的觸發器例子。

我們在數據庫中增加一個表,用來記錄日志,其結構如下:

QUOTE:uSysLog

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

lId int

lEvent nvarchar(200)

lTime datetime DEFAULT GetDate()

現在假設這張表是用來記錄系統的日志用的,當我們刪除一條流水帳時,往日志表里記錄一條事件,那么我們來創建一個基于 uRecord 表的刪除時的觸發器

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

-- 表明在插入記錄之后執行這個觸發器

FOR DELETE

AS

-- 當前刪除的流水號

DECLARE @intID int

-- 當前刪除的數量

DECLARE @intNum int

-- 當前模式

DECLARE @intMode int

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

IF @@ROWCOUNT >0

BEGIN

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

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

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

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

END

建立好觸發器后,現在只要我們刪除 uRecord 表中的一條記錄,就會在系統日志中增加一條事件日志。

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

標簽: Sql Server 數據庫
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美日韩在线一区二区| 日本欧美国产| 亚洲自啪免费| 日韩国产一区二| 你懂的国产精品| 日本久久成人网| 日韩精品一二三四| 国产精品videossex| 日韩国产一区二区| 亚洲在线电影| 日韩一二三区在线观看| 久久精品理论片| 午夜精品婷婷| 亚洲专区视频| 欧美男人天堂| 日韩中文字幕av电影| 国产精品视频一区二区三区四蜜臂 | 国产一区二区三区亚洲| 日韩精品中文字幕第1页| 99成人在线| 久久精品午夜| 亚洲精品电影| 欧美精品91| 99视频一区| 国产劲爆久久| 亚洲深夜影院| 精品一区二区三区的国产在线观看| 在线日韩视频| 国产精品综合色区在线观看| 久久人人精品| 日日夜夜免费精品视频| 日韩免费av| 日韩av在线免费观看不卡| 中文字幕一区久| 亚洲精品无播放器在线播放| 97在线精品| 日本成人在线不卡视频| 99精品小视频| 久久字幕精品一区| 免费欧美在线视频| 日韩免费在线| 国产精品日本一区二区三区在线| 91成人精品视频| 精品国产aⅴ| 天海翼亚洲一区二区三区| 99久久99久久精品国产片果冰| 亚洲精品a级片| 久热re这里精品视频在线6| 国产精品亚洲欧美日韩一区在线| 欧美日韩国产免费观看视频| 欧美xxxx性| 日韩精品一级中文字幕精品视频免费观看 | 中文在线免费视频| 日韩激情中文字幕| 激情综合自拍| 国产精品成人一区二区不卡| 欧美日韩网址| 视频一区视频二区中文| 群体交乱之放荡娇妻一区二区| 国产精品红桃| 亚洲精品第一| 亚洲资源av| 国产99亚洲| 精品国产乱码久久久久久樱花| 日韩国产欧美一区二区三区| 日韩午夜在线| 日本高清不卡一区二区三区视频 | 欧美日韩视频网站| 麻豆国产精品| 国产乱子精品一区二区在线观看 | 日本伊人久久| 免费在线视频一区| 欧美在线资源| 亚洲一级少妇| 成人在线黄色| 国产精品18| 日韩区欧美区| 亚洲人成亚洲精品| 美女黄网久久| 在线综合欧美| 91精品二区| 久久蜜桃av| 视频福利一区| 日韩精品首页| 色婷婷久久久| 欧美sss在线视频| 日韩在线二区| 日韩三区免费| 亚洲综合在线电影| 蜜臀久久精品| 天堂av在线| 麻豆mv在线观看| 日韩一区二区三区免费播放| 日本久久综合| 蜜臀久久精品| 国产在线|日韩| 不卡在线一区| 久久不射网站| 在线免费观看亚洲| 亚洲日本在线观看视频| 亚洲精品麻豆| 欧美永久精品| 国产精品a级| 国产成人精品一区二区免费看京 | 日韩高清国产一区在线| 99re国产精品| 亚洲精品女人| 欧美一区自拍| 精品伊人久久| 成人美女视频| 午夜欧美视频| 视频一区中文字幕国产| 天堂va欧美ⅴa亚洲va一国产| 日韩激情一二三区| 国产精品115| 在线中文字幕播放| 亚洲特级毛片| 国产一区91| 亚洲精品观看| 国产精品综合色区在线观看| 成人在线丰满少妇av| 欧美一区二区三区高清视频| 影音国产精品| 亚洲视频电影在线| 婷婷综合电影| 久久精品国产成人一区二区三区| 蜜桃av在线播放| 日韩视频免费| 日韩黄色免费网站| 精品国产乱码久久久| 999久久久免费精品国产| 噜噜噜躁狠狠躁狠狠精品视频 | 一区二区电影| 国产精品亚洲人成在99www| 国产精品国产三级国产在线观看| 国产精品久久久久av电视剧| 99国产精品99久久久久久粉嫩| 日韩二区三区在线观看| 91欧美日韩| 中文在线一区| 国产精品视频首页| 久久理论电影| 亚洲专区欧美专区| 国产欧美啪啪| 99久久久久久中文字幕一区| 最新国产精品视频| 久久精品色播| 亚洲免费影视| 国产精品视频一区二区三区 | 日韩中文欧美在线| 久久精品一区二区国产| 国产综合亚洲精品一区二| 亚洲精品大全| 国产一区丝袜| 欧美综合国产| 精品精品99| 石原莉奈在线亚洲二区| 久久精品亚洲一区二区| 野花国产精品入口| 麻豆视频久久| 鲁大师影院一区二区三区| 久久天堂影院| 一区二区国产精品| 日韩视频网站在线观看| 日韩一区免费| 人人精品亚洲| 国产精品一区毛片| 激情91久久| 精品在线网站观看| 男人的天堂久久精品| 成人在线超碰| 亚洲精品日本| 亚洲国内精品| 久久99精品久久久野外观看| 伊人影院久久| 国产va免费精品观看精品视频| 日本欧美在线看| 精品捆绑调教一区二区三区| 97久久超碰| 日韩视频一区| 首页国产精品| 久久精品xxxxx| 欧美女激情福利| 精品国产乱码久久久| 亚洲永久精品唐人导航网址| 久久久久免费av| 免费一级欧美片在线观看网站| 日韩一区二区免费看| 六月婷婷综合| 国产精品黄网站| 婷婷成人av| 黄色免费成人| 欧美不卡高清一区二区三区| 国产精品久久久久久久免费软件| 老鸭窝毛片一区二区三区| 快播电影网址老女人久久| 国产精品nxnn| 日韩av网站在线观看| 亚洲综合精品四区| 播放一区二区|