SQL数据库触发器的实际应用
触发器是一种特殊类型的存储过程,不由用户直接调用。当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。
触发器的一个应用就是保持和维护数据的完整性及合法性。例如,在程序里提交任意数据,然后由触发器来判断数据的完整性及合法性。这里只是举例说明,实际应用中不推荐这样用,应该由应用程序来验证数据的完整性及合法性。
下面是一个实例,假设当前数据库中有“uMateriel”和“uRecord”两张表,他们分别用来保存物品信息和物品的出入库记录信息。现在,我们要购入物品 A,数量 100,时间为当天,已知物品 A 的编号为 1,那么通常我们需要做以下两个步骤:
1. 在 uRecord 记录表中增加一条物品 A 的购入记录:
INSERT INTO uRecord (mId, rNum, rMode) VALUES (1, 100, 0)
2. 更新 uMateriel 物品库存表中物品 A 的数量:
UPDATE uMateriel SET mNum = mNum + 100 WHERE mId=1
也就是说代码中要先后处理以上两条语句,才能保证库存的准确性,以 ASP 代码为例:
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
但是,我们可以使用触发器来简化以上代码。创建一个触发器,触发器的语法很长,简化为:
CREATE TRIGGER 触发器名
disibledevent=rMode
FROM Deleted
-- 向日志表中插入一条简单的删除事件日志
INSERT INTO uSysLog (lEvent) VALUES ('用 户 删 除 了 流 水 号 为 :' + CAST(@intID asnvarchar(20) + ',数量:' + CAST(@intNum as nvarchar(20) + ',方向:' + CASE @intMode WHEN 0 THEN '入库' ELSE '出库' END)
建立好触发器后,现在只要我们删除 uRecord 表中的一条记录,就会在系统日志中增加一条事件日志。
通过以上简单的介绍,希望原来没有使用过触发器的朋友能对触发器有个大致的概念和印象,如果你要深入了解的话,SQL SERVER 联机丛书就是你的好帮手。
触发器的应用非常广泛,它可以用来强制复杂的业务规则或要求,例如:
* 保持和维护数据的完整性及合法性
* 强制复杂的业务规则或要求
* 实现数据的审核跟踪
* 实现数据的自动备份
等等。
触发器是一种非常有用的工具,能够帮助我们更好地管理和维护数据库。