说明:由于个人能力有限,文章中难免会出现错误或遗漏的地方,敬请谅解!同时欢迎你指出,以便我能及时修改,以免误导下一个看官。最后希望本文能给你带来一定的帮助。
不知道在坛子里有多少朋友使用触发器,如果你已经对触发器很了解了,那么请跳过此文,如果你还没有使用过触发器的话,那就让我们来认识一下吧。
QUOTE:
定义:
触发器是一种特殊类型的存储过程,不由用户直接调用。当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。
触发器一个应用就是保持和维护数据的完整性及合法性,那么怎么来理解呢?就是说你可以在程序里提交任意数据,然后由触发器来判断数据的完整性及合法性,当然这里只是举例说明,实际应用中不推荐这样用,应该由应用程序来验证数据的完整性及合法性。
下面我还是以实例的方式来描述触发器的应用。
假设:当前数据库中有“uMateriel”和“uRecord”两张表,他们分别用来保存物品信息和物品的出入库记录信息,结构如下
QUOTE:uMateriel
----------------
mId int
mName nvarchar(40)
mNum int DEFAULT 0
uRecord
----------------
rId int
mId int
rNum int
rDate datetime DEFAULT GetDate()
rMode bit 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