赞
踩
一、什么是触发器?
二、触发器主要提供的功能
三、使用触发器的说明
四、触发器类型
inserted 表
deleted 表
修改操作 | inserted表 | deleted表 |
---|---|---|
增加(INSERT)记录 | 存放新增的记录 | 无 |
删除(DELETE)记录 | 无 | 存放被删除的记录 |
修改(UPDATE)记录 | 存放更新后的记录 | 存放更新前的记录 |
五、创建触发器
创建触发器的语法:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR/AFTER/INSTEAD OF
[DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
--WITH ENCRYPTION表示加密触发器定义的SQL文本
--DELETE, INSERT, UPDATE指定触发器的类型
注意: SQL Server 不允许在触发器中使用下列语句:
ALTER DATABASE、CREATE DATABASE、DISK INIT、DISK RESIZE、DROP DATABASE、LOAD DATABASE、LOAD LOG、RECONFIGURE、RESTORE DATABASE、RESTORE LOG
六、具体实例
一个典型的应用:银行的取款系统
1.创建帐户信息表bank和交易表transInfo
CREATE TABLE bank --帐户信息表
(
customerName CHAR(8) NOT NULL, --顾客姓名
cardID CHAR(10) NOT NULL , --卡号
currentMoney MONEY NOT NULL --当前余额
)
CREATE TABLE transInfo --交易信息表
(
cardID CHAR(10) NOT NULL, --卡号
transType CHAR(4) NOT NULL, --交易类型(存入/支取)
transMoney MONEY NOT NULL, --交易金额
transDate DATETIME NOT NULL, --交易日期
)
2.创建 INSERT 触发器
当用户想往银行卡中存入或者支出的时候,就要向transInfo表中插入一条操作数据,此时,bank 表的currentMoney 余额就应该根据操作类型进行相应的变化。
/*
创建一个transInfo 表的insert触发器,当对transInfo 表进行插入操作的时候,就会调用该触发器,将bank表中的余额改掉
*/
CREATE TRIGGER trig_transInfo
ON transInfo
FOR INSERT
AS
DECLARE @type char(4),@outMoney MONEY
DECLARE @myCardID char(10),@balance MONEY
SELECT @type=transType,@outMoney=transMoney,
@myCardID=cardID FROM inserted --存放插入数据的临时表
IF (@type='支取')
UPDATE bank SET currentMoney=currentMoney-@outMoney WHERE cardID=@myCardID
ELSE
UPDATE bank SET currentMoney=currentMoney+@outMoney WHERE cardID=@myCardID
GO

3.创建delete触发器
当删除交易信息表时,有时候需要备份要删除的数据,创建触发器,自动备份被删除的数据到表backupTable中 。
/*在交易信息表上创建DELETE触发器
被删除的数据可以从deleted表中获取
*/
CREATE TRIGGER trig_delete_transInfo
ON transInfo
FOR DELETE
AS
print '开始备份数据,请稍后......'
IF NOT EXISTS(SELECT * FROM sysobjects
WHERE name='backupTable')
SELECT * INTO backupTable FROM deleted
ELSE
INSERT INTO backupTable
SELECT * FROM deleted
print '备份数据成功,备份表中的数据为:'
SELECT * FROM backupTable
GO

4创建update触发器
跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示,在bank表上创建UPDATE触发器 ,修改前的数据可以从deleted表中获取,修改后的数据可以从inserted表中获取
CREATE TRIGGER trig_update_bank
ON bank FOR UPDATE
AS
DECLARE @beforeMoney MONEY,@afterMoney MONEY
--提示:update操作是将原有数据先删除,然后重新插入数据。
SELECT @beforeMoney=currentMoney FROM deleted
SELECT @afterMoney=currentMoney FROM inserted
IF ABS(@afterMoney-@beforeMoney)>20000
BEGIN
print '交易金额:'+convert(varchar(8),
ABS(@afterMoney-@beforeMoney))
print '每笔交易不能超过2万元,交易失败'
ROLLBACK TRANSACTION
END
GO
UPDATE触发器除了跟踪数据的变化(修改)外,还可以检查是否修改了某列的数据 ,使用UPDATE(列)函数检测是否修改了某列
CREATE TRIGGER trig_update_transInfo
ON transInfo
FOR UPDATE
AS
IF UPDATE(transDate)
BEGIN
print '交易失败.....'
ROLLBACK TRANSACTION
END
GO
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。