电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

QUOTE:

定義:

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

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

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

假設(shè):當(dāng)前數(shù)據(jù)庫(kù)中有“uMateriel”和“uRecord”兩張表,他們分別用來(lái)保存物品信息和物品的出入庫(kù)記錄信息,結(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)在,我們要購(gòu)入物品A,數(shù)量100,時(shí)間為當(dāng)天,已知物品A的編號(hào)為1,那么通常我們需要做以下兩個(gè)步驟:

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

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

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

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

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

QUOTE:On Error Resume Next

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

With adoConn

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

.BeginTrans

'// 插入物品入庫(kù)記錄

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

'// 更新物品庫(kù)存記錄

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

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

If Err.Number <> 0 Then

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

.RollbackTrans

Response.Write '錯(cuò)誤!'

Err.Clear

Else

'// 如果沒(méi)有錯(cuò)誤,則提交事務(wù)

.CommitTrans

End If

End With

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

創(chuàng)建觸發(fā)器的語(yǔ)法很長(zhǎng),簡(jiǎn)化為:

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

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

AS

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

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

AFTER

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

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

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

INSTEAD OF

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

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

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

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

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

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

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

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

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

AFTER INSERT

AS

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

DECLARE @intID int

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

DECLARE @intNum int

-- 當(dāng)前模式

DECLARE @intMode int

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

IF @@ROWCOUNT >0

BEGIN

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

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

-- 判斷當(dāng)前模式(0為入庫(kù),1為出庫(kù))來(lái)更新當(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)在來(lái)了解一下這個(gè)觸發(fā)器,首先使用 CREATE TRIGGER 語(yǔ)句定義一個(gè)基于 uRecord 表的觸發(fā)器 trUpdateMaterielNum,AFTER INSERT 表明這個(gè)觸發(fā)器會(huì)在插入記錄之后執(zhí)行,也就是說(shuō)當(dāng)我們?cè)诔绦蚶飯?zhí)行 INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0) 這條語(yǔ)句之后,trUpdateMaterielNum這個(gè)觸發(fā)器里的內(nèi)容就會(huì)被自動(dòng)執(zhí)行,也就是說(shuō)庫(kù)存將會(huì)被自動(dòng)更新了。現(xiàn)在我們更改一下ASP的代碼

QUOTE:On Error Resume Next

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

'// 插入物品入庫(kù)記錄

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

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

If Err.Number <> 0 Then

Response.Write '錯(cuò)誤!'

Err.Clear

End If

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

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

我們?cè)跀?shù)據(jù)庫(kù)中增加一個(gè)表,用來(lái)記錄日志,其結(jié)構(gòu)如下:

QUOTE:uSysLog

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

lId int

lEvent nvarchar(200)

lTime datetime DEFAULT GetDate()

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

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

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

FOR DELETE

AS

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

DECLARE @intID int

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

DECLARE @intNum int

-- 當(dāng)前模式

DECLARE @intMode int

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

IF @@ROWCOUNT >0

BEGIN

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

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

-- 向日志表中插入一條簡(jiǎn)單的刪除事件日志

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

END

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

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

主站蜘蛛池模板: 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 | 中国品牌排名投票_十大品牌榜单_中国著名品牌【中国品牌榜】 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 必胜高考网_全国高考备考和志愿填报信息平台 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | 挨踢网-大家的导航! | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 直读光谱仪,光谱分析仪,手持式光谱仪,碳硫分析仪,创想仪器官网 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 潍坊大集网-潍坊信息港-潍坊信息网 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 |